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. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  10. . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
  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) IResult[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 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) IResult[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. if err != nil {
  66. return NewErr[int](fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err))
  67. }
  68. sf.val = int(signed)
  69. return 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) 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 NewErr[int](err)
  97. }
  98. return NewRes(sf.val)
  99. }