def_num_mut.go 3.1 KB

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