kint.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // package kint -- целочисленная переменная ядра.
  2. package kint
  3. import (
  4. "bytes"
  5. "encoding/binary"
  6. "os"
  7. "strconv"
  8. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  11. )
  12. // Целочисленная переменная ядра.
  13. type KernInt struct {
  14. val defs.Int
  15. }
  16. // NewInt -- возвращает новое целое ядра.
  17. func NewInt(val defs.Int) core_spec.Int {
  18. sf := &KernInt{
  19. val: val,
  20. }
  21. return sf
  22. }
  23. // Get -- возвращает хранимое значение потокобезопасной переменной.
  24. func (sf *KernInt) Get() defs.Int {
  25. return sf.val
  26. }
  27. // Set -- устанавливает хранимое потокобезопасное значение.
  28. func (sf *KernInt) Set(val defs.Int) {
  29. sf.val = val
  30. }
  31. // Inc -- увеличивает на единицу.
  32. func (sf *KernInt) Inc() {
  33. sf.val++
  34. }
  35. // Dec -- уменьшает на единицу.
  36. func (sf *KernInt) Dec() {
  37. sf.val--
  38. }
  39. // Reset -- сбрасывает хранимое потокобезопасное значение.
  40. func (sf *KernInt) Reset() {
  41. sf.val = 0
  42. }
  43. // FromStr -- устанавливает значение из строки.
  44. func (sf *KernInt) FromStr(strVal defs.ITxtFix) mL0.IResult[defs.Int] {
  45. iVal, err := strconv.Atoi(strVal.String())
  46. if err != nil {
  47. err := defs.Err("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)
  48. return mL0.NewErr[defs.Int](err)
  49. }
  50. sf.val = defs.Int(iVal)
  51. return mL0.NewOk(sf.val)
  52. }
  53. // ToStr -- возвращает как строку.
  54. func (sf *KernInt) ToStr() defs.ITxtFix {
  55. return defs.Txt("%v", sf.val)
  56. }
  57. // FromByte -- устанавливает значение из байтов (BigEndian, net order).
  58. func (sf *KernInt) FromByte(binData []byte) mL0.IResult[defs.Int] {
  59. lenBin := len(binData)
  60. if lenBin < 8 {
  61. err := defs.Err("KInt.FromByte(): len(%v) bytes shorts", lenBin)
  62. return mL0.NewErr[defs.Int](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 := defs.Err("KInt.FromByte(): in read []byte, err=\n\t%w", err)
  69. return mL0.NewErr[defs.Int](err)
  70. }
  71. sf.val = defs.Int(signed)
  72. return mL0.NewOk(sf.val)
  73. }
  74. // ToByte -- возвращает как срез байт.
  75. func (sf *KernInt) ToByte() []byte {
  76. buf := make([]byte, 8)
  77. binary.BigEndian.PutUint64(buf, uint64(sf.val))
  78. return buf
  79. }
  80. // FromBool -- устанавливает значение из булева.
  81. func (sf *KernInt) FromBool(isVal bool) defs.Int {
  82. if isVal {
  83. sf.val = -1
  84. return -1
  85. }
  86. sf.val = 0
  87. return 0
  88. }
  89. // ToBool -- возвращает как булево значение.
  90. func (sf *KernInt) ToBool() bool {
  91. return sf.val != 0
  92. }
  93. // Getenv -- устанавливает значение из окружения.
  94. func (sf *KernInt) Getenv(env defs.ITxtFix) core_spec.IResult[defs.Int] {
  95. strVal := defs.ATxt(os.Getenv(env.String()))
  96. res := sf.FromStr(defs.Txt(strVal))
  97. if res.IsErr() {
  98. err := defs.Err("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  99. return mL0.NewErr[defs.Int](err)
  100. }
  101. return mL0.NewOk(sf.val)
  102. }