kint.go 2.9 KB

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