// package kint -- целочисленная переменная ядра. package kint import ( "bytes" "encoding/binary" "os" "strconv" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" ) // Целочисленная переменная ядра. type KernInt struct { val defs.Int } // NewInt -- возвращает новое целое ядра. func NewInt(val defs.Int) core_spec.Int { sf := &KernInt{ val: val, } return sf } // Get -- возвращает хранимое значение потокобезопасной переменной. func (sf *KernInt) Get() defs.Int { return sf.val } // Set -- устанавливает хранимое потокобезопасное значение. func (sf *KernInt) Set(val defs.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 defs.ITxtFix) mL0.IResult[defs.Int] { iVal, err := strconv.Atoi(strVal.String()) if err != nil { err := defs.Err("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err) return mL0.NewErr[defs.Int](err) } sf.val = defs.Int(iVal) return mL0.NewOk(sf.val) } // ToStr -- возвращает как строку. func (sf *KernInt) ToStr() defs.ITxtFix { return defs.TxtFix("%v", sf.val) } // FromByte -- устанавливает значение из байтов (BigEndian, net order). func (sf *KernInt) FromByte(binData []byte) mL0.IResult[defs.Int] { lenBin := len(binData) if lenBin < 8 { err := defs.Err("KInt.FromByte(): len(%v) bytes shorts", lenBin) return mL0.NewErr[defs.Int](err) } var signed int64 buf := bytes.NewReader(binData) err := binary.Read(buf, binary.BigEndian, &signed) if err != nil { err := defs.Err("KInt.FromByte(): in read []byte, err=\n\t%w", err) return mL0.NewErr[defs.Int](err) } sf.val = defs.Int(signed) return mL0.NewOk(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) defs.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 defs.ITxtFix) core_spec.IResult[defs.Int] { strVal := defs.ATxt(os.Getenv(env.String())) res := sf.FromStr(defs.TxtFix(strVal)) if res.IsErr() { err := defs.Err("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err()) return mL0.NewErr[defs.Int](err) } return mL0.NewOk(sf.val) }