| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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())
- }
|