kint.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // package kint -- целочисленная переменная ядра
  2. package kint
  3. import (
  4. "bytes"
  5. "encoding/binary"
  6. "fmt"
  7. "os"
  8. "strconv"
  9. . "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
  10. . "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
  11. )
  12. // Целочисленная переменная ядра
  13. type KernInt struct {
  14. val int
  15. }
  16. // NewInt -- возвращает новое целое ядра
  17. func NewInt(val int) 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) Result[int] {
  45. iVal, err := strconv.Atoi(strVal)
  46. if err != nil {
  47. return NewErr[int](fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
  48. }
  49. sf.val = iVal
  50. return NewOk(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) Result[int] {
  58. lenBin := len(binData)
  59. if lenBin < 8 {
  60. return 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. Hassert(err == nil, "KernInt.FromByte(): in read []byte, err=\n\t%w", err)
  66. sf.val = int(signed)
  67. return NewOk(sf.val)
  68. }
  69. // ToByte -- возвращает как срез байт
  70. func (sf *KernInt) ToByte() []byte {
  71. buf := make([]byte, 8)
  72. binary.BigEndian.PutUint64(buf, uint64(sf.val))
  73. return buf
  74. }
  75. // FromBool -- устанавливает значение из булева
  76. func (sf *KernInt) FromBool(isVal bool) int {
  77. if isVal {
  78. sf.val = -1
  79. return -1
  80. }
  81. sf.val = 0
  82. return 0
  83. }
  84. // ToBool -- возвращает как булево значение
  85. func (sf *KernInt) ToBool() bool {
  86. return sf.val != 0
  87. }
  88. // Getenv -- устанавливает значение из окружения
  89. func (sf *KernInt) Getenv(env string) Result[int] {
  90. strVal := os.Getenv(env)
  91. res := sf.FromStr(strVal)
  92. if res.IsErr() {
  93. err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  94. return NewErr[int](err)
  95. }
  96. return NewOk(sf.val)
  97. }