package def_num import ( "bytes" "encoding/binary" "os" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result" ) // MNum -- внутреннее изменяемое число. type MNum struct { LNum } // MutNum -- возвращает новое внутреннее изменяемое число. func MutNum[T def_spec_base.NumConstraint](val T) *MNum { sf := &MNum{ LNum: *LetNum(val), } return sf } // Set -- устанавливает хранимое число. func (sf *MNum) Set[T def_spec_base.NumConstraint](val T) { sf.val = def_spec_base.Num(val) } // Inc -- увеличивает на единицу. func (sf *MNum) Inc() { sf.val++ } // Dec -- уменьшает на единицу. func (sf *MNum) Dec() { sf.val-- } // Reset -- сбрасывает хранимое число. func (sf *MNum) Reset() { sf.val = 0 } // FromTxt -- устанавливает значение из текста. func (sf *MNum) FromTxt(val *def_txt.LTxt) *result.Result[def_spec_base.Num] { res := def_spec_fn.Atoi(val.Get()) if res.IsErr() { err := def_err.LetErr(res.Err().Error()) return result.ResErr[def_spec_base.Num](err) } sf.val = res.Ok() return result.ResOk(sf.val) } // FromByte -- устанавливает значение из байтов (BigEndian, net order). func (sf *MNum) FromByte(binData []byte) *result.Result[def_spec_base.Num] { lenBin := len(binData) if lenBin < 8 { err := def_err.LetErr("MNum.FromByte(): len(%v) bytes shorts", lenBin) return result.ResErr[def_spec_base.Num](err) } var signed int64 buf := bytes.NewReader(binData) err := binary.Read(buf, binary.BigEndian, &signed) if err != nil { err := def_err.LetErr("MNum.FromByte(): in read []byte, err=\n\t%w", err) return result.ResErr[def_spec_base.Num](err) } sf.val = def_spec_base.Num(signed) return result.ResOk(sf.val) } // Let -- возвращает неизменяемое значение func (sf *MNum) Let() *LNum { return LetNum(sf.val) } // Txt -- возвращает незменяемую внутреннюю строку func (sf *MNum) Txt() *def_txt.LTxt { return def_txt.LetTxt("%v", sf.val) } // ToBool -- возвращает булево значение func (sf *MNum) ToBool() def_spec_base.Bool { return sf.val != 0 } // FromEnv -- устанавливает значение из окружения. // // ВНИМАНИЕ!!!! // Потенциально опасно!!! func (sf *MNum) FromEnv(env *def_txt.LTxt) *result.Result[*LNum] { envVal := env.String() val := os.Getenv(envVal) if val == "" { err := def_err.LetErr("sf *MNum.FromEnv(): env %q not set", envVal) return result.ResErr[*LNum](err) } res := sf.FromTxt(def_txt.LetTxt(val)) if res.IsErr() { err := def_err.LetErr("sf *MNum.FromEnv(): from env(%v) parse val(%q), err=\n\t%w", env, val, res.Err()) return result.ResErr[*LNum](err) } return result.ResOk(sf.Let()) }