kint.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // package kint -- целочисленная переменная ядра.
  2. package kint
  3. import (
  4. "bytes"
  5. "encoding/binary"
  6. "fmt"
  7. "os"
  8. "strconv"
  9. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  10. mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
  11. )
  12. // Целочисленная переменная ядра.
  13. type KernInt struct {
  14. val int
  15. }
  16. // NewInt -- возвращает новое целое ядра.
  17. func NewInt(val int) mKs.Int {
  18. sf := &KernInt{
  19. val: val,
  20. }
  21. return sf
  22. }
  23. // Get -- возвращает хранимое значение потокобезопасной переменной.
  24. func (sf *KernInt) Get() int {
  25. return sf.val
  26. }
  27. // Set -- устанавливает хранимое потокобезопасное значение.
  28. func (sf *KernInt) Set(val 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 string) mL0.IResult[int] {
  45. iVal, err := strconv.Atoi(strVal)
  46. if err != nil {
  47. return mL0.NewErr[int](fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
  48. }
  49. sf.val = iVal
  50. return mL0.NewRes(iVal)
  51. }
  52. // ToStr -- возвращает как строку.
  53. func (sf *KernInt) ToStr() string {
  54. return fmt.Sprint(sf.val)
  55. }
  56. // FromByte -- устанавливает значение из байтов (BigEndian, net order).
  57. func (sf *KernInt) FromByte(binData []byte) mL0.IResult[int] {
  58. lenBin := len(binData)
  59. if lenBin < 8 {
  60. return mL0.NewErr[int](fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin))
  61. }
  62. var signed int64
  63. buf := bytes.NewReader(binData)
  64. err := binary.Read(buf, binary.BigEndian, &signed)
  65. if err != nil {
  66. return mL0.NewErr[int](fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err))
  67. }
  68. sf.val = int(signed)
  69. return mL0.NewRes(sf.val)
  70. }
  71. // ToByte -- возвращает как срез байт.
  72. func (sf *KernInt) ToByte() []byte {
  73. buf := make([]byte, 8)
  74. binary.BigEndian.PutUint64(buf, uint64(sf.val))
  75. return buf
  76. }
  77. // FromBool -- устанавливает значение из булева.
  78. func (sf *KernInt) FromBool(isVal bool) int {
  79. if isVal {
  80. sf.val = -1
  81. return -1
  82. }
  83. sf.val = 0
  84. return 0
  85. }
  86. // ToBool -- возвращает как булево значение.
  87. func (sf *KernInt) ToBool() bool {
  88. return sf.val != 0
  89. }
  90. // Getenv -- устанавливает значение из окружения.
  91. func (sf *KernInt) Getenv(env string) mL0.IResult[int] {
  92. strVal := os.Getenv(env)
  93. res := sf.FromStr(strVal)
  94. if res.IsErr() {
  95. err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  96. return mL0.NewErr[int](err)
  97. }
  98. return mL0.NewRes(sf.val)
  99. }