// package kint -- целочисленная переменная ядра. package kint import ( "bytes" "encoding/binary" "fmt" "os" "strconv" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" ) // Целочисленная переменная ядра. type KernInt struct { val int } // NewInt -- возвращает новое целое ядра. func NewInt(val int) mKt.Int { sf := &KernInt{ val: val, } return sf } // Get -- возвращает хранимое значение потокобезопасной переменной. func (sf *KernInt) Get() int { return sf.val } // Set -- устанавливает хранимое потокобезопасное значение. func (sf *KernInt) Set(val int) { sf.val = val } // Inc -- увеличивает на единицу. func (sf *KernInt) Inc() { sf.val++ } // Dec -- уменьшает на единицу. func (sf *KernInt) Dec() { sf.val-- } // Reset -- сбрасывает хранимое потокобезопасное значение. func (sf *KernInt) Reset() { sf.val = 0 } // FromStr -- устанавливает значение из строки. func (sf *KernInt) FromStr(strVal string) *mL0.Result[int] { iVal, err := strconv.Atoi(strVal) if err != nil { return mL0.NewErr[int](fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)) } sf.val = iVal return mL0.NewRes(iVal) } // ToStr -- возвращает как строку. func (sf *KernInt) ToStr() string { return fmt.Sprint(sf.val) } // FromByte -- устанавливает значение из байтов (BigEndian, net order). func (sf *KernInt) FromByte(binData []byte) *mL0.Result[int] { lenBin := len(binData) if lenBin < 8 { return mL0.NewErr[int](fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin)) } var signed int64 buf := bytes.NewReader(binData) err := binary.Read(buf, binary.BigEndian, &signed) if err != nil { return mL0.NewErr[int](fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err)) } sf.val = int(signed) return mL0.NewRes(sf.val) } // ToByte -- возвращает как срез байт. func (sf *KernInt) ToByte() []byte { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, uint64(sf.val)) return buf } // FromBool -- устанавливает значение из булева. func (sf *KernInt) FromBool(isVal bool) int { if isVal { sf.val = -1 return -1 } sf.val = 0 return 0 } // ToBool -- возвращает как булево значение. func (sf *KernInt) ToBool() bool { return sf.val != 0 } // Getenv -- устанавливает значение из окружения. func (sf *KernInt) Getenv(env string) *mL0.Result[int] { strVal := os.Getenv(env) res := sf.FromStr(strVal) if res.IsErr() { err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err()) return mL0.NewErr[int](err) } return mL0.NewRes(sf.val) }