// package mod_num -- номер модуля package mod_num import ( "fmt" "strconv" "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" ) // AModNum -- номер модуля. type AModNum int // IModNumFix -- фиксированный модуль номера. type IModNumFix interface { // Get -- получить номер модуля Get() AModNum // String -- строковое представление номера модуля String() string } // moduleNum -- номер модуля. type moduleNum struct { num AModNum // Номер модуля } var ( nextNum AModNum // Следующий номер модуля block sync.Mutex ) // NewModuleNum -- возвращает новый модуль номера. func NewModuleNumFix() IModNumFix { block.Lock() defer block.Unlock() sf := &moduleNum{ num: nextNum, } nextNum++ return sf } // FromStr -- возвращает новый номер модуля из строки. func FromStr(strNumMod string) core_spec.IResult[IModNumFix] { iNum, err := strconv.Atoi(strNumMod) if err != nil { err := fmt.Errorf("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", strNumMod, err) return lev0.NewErr[IModNumFix](err) } sf := &moduleNum{ num: AModNum(iNum), } return lev0.NewOk(IModNumFix(sf)) } // Get -- получить номер модуля // //go:fix inline func (sf *moduleNum) Get() AModNum { return sf.num } // String -- строковое представление номера модуля // //go:fix inline func (sf *moduleNum) String() string { return fmt.Sprint(sf.num) }