def_num_mut.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package def_num
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "os"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_err"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_fn"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_txt"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/table/owner"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/d0/result"
  12. )
  13. // MNum -- внутреннее изменяемое число.
  14. type MNum struct {
  15. LNum
  16. }
  17. // MutNum -- возвращает новое внутреннее изменяемое число.
  18. func MutNum[T def_spec_base.NumConstraint](owner *owner.LOwner, val T) *MNum {
  19. sf := &MNum{
  20. LNum: *LetNum(owner, val),
  21. }
  22. return sf
  23. }
  24. // Set -- устанавливает хранимое число.
  25. func (sf *MNum) Set[T def_spec_base.NumConstraint](val T) {
  26. sf.CheckOwner()
  27. sf.val = def_spec_base.Num(val)
  28. }
  29. // Inc -- увеличивает на единицу.
  30. func (sf *MNum) Inc() {
  31. sf.CheckOwner()
  32. sf.val++
  33. }
  34. // Dec -- уменьшает на единицу.
  35. func (sf *MNum) Dec() {
  36. sf.CheckOwner()
  37. sf.val--
  38. }
  39. // Reset -- сбрасывает хранимое число.
  40. func (sf *MNum) Reset() {
  41. sf.CheckOwner()
  42. sf.val = 0
  43. }
  44. // FromTxt -- устанавливает значение из текста.
  45. func (sf *MNum) FromTxt(val *def_txt.LTxt) *result.Result[def_spec_base.Num] {
  46. sf.CheckOwner()
  47. res := def_spec_fn.Atoi(val.Get())
  48. if res.IsErr() {
  49. err := def_err.LetErr(res.Err().Error())
  50. return result.ResErr[def_spec_base.Num](err)
  51. }
  52. sf.val = res.Ok()
  53. return result.ResOk(sf.val)
  54. }
  55. // FromByte -- устанавливает значение из байтов (BigEndian, net order).
  56. func (sf *MNum) FromByte(binData []byte) *result.Result[def_spec_base.Num] {
  57. sf.CheckOwner()
  58. lenBin := len(binData)
  59. if lenBin < 8 {
  60. err := def_err.LetErr("MNum.FromByte(): len(%v) bytes shorts",
  61. lenBin)
  62. return result.ResErr[def_spec_base.Num](err)
  63. }
  64. var signed int64
  65. buf := bytes.NewReader(binData)
  66. err := binary.Read(buf, binary.BigEndian, &signed)
  67. if err != nil {
  68. err := def_err.LetErr("MNum.FromByte(): in read []byte, err=\n\t%w",
  69. err)
  70. return result.ResErr[def_spec_base.Num](err)
  71. }
  72. sf.val = def_spec_base.Num(signed)
  73. return result.ResOk(sf.val)
  74. }
  75. // Txt -- возвращает незменяемую внутреннюю строку
  76. func (sf *MNum) Txt() *def_txt.LTxt {
  77. sf.CheckOwner()
  78. return def_txt.LetTxt("%v", sf.val)
  79. }
  80. // ToBool -- возвращает булево значение
  81. func (sf *MNum) ToBool() def_spec_base.Bool {
  82. sf.CheckOwner()
  83. return sf.val != 0
  84. }
  85. // FromEnv -- устанавливает значение из окружения.
  86. //
  87. // ВНИМАНИЕ!!!!
  88. // Потенциально опасно!!!
  89. func (sf *MNum) FromEnv(env *def_txt.LTxt) *result.Result[*LNum] {
  90. sf.CheckOwner()
  91. envVal := env.String()
  92. val := os.Getenv(envVal)
  93. if val == "" {
  94. err := def_err.LetErr("sf *MNum.FromEnv(): env %q not set", envVal)
  95. return result.ResErr[*LNum](err)
  96. }
  97. res := sf.FromTxt(def_txt.LetTxt(val))
  98. if res.IsErr() {
  99. err := def_err.LetErr("sf *MNum.FromEnv(): from env(%v) parse val(%q), err=\n\t%w", env, val, res.Err())
  100. return result.ResErr[*LNum](err)
  101. }
  102. return result.ResOk(sf.Let())
  103. }