mod_num.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // package mod_num -- номер модуля
  2. package mod_num
  3. import (
  4. "fmt"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  8. )
  9. // AModNum -- номер модуля.
  10. type AModNum defs.Int
  11. // IModNumFix -- фиксированный модуль номера.
  12. type IModNumFix interface {
  13. defs.IString
  14. // Get -- получить номер модуля
  15. Get() AModNum
  16. }
  17. // moduleNum -- номер модуля.
  18. type moduleNum struct {
  19. num AModNum // Номер модуля
  20. }
  21. var (
  22. nextNum AModNum // Следующий номер модуля
  23. block sync.Mutex
  24. )
  25. // NewModuleNum -- возвращает новый модуль номера.
  26. func NewModuleNumFix() IModNumFix {
  27. block.Lock()
  28. defer block.Unlock()
  29. sf := &moduleNum{
  30. num: nextNum,
  31. }
  32. nextNum++
  33. return sf
  34. }
  35. // FromStr -- возвращает новый номер модуля из строки.
  36. func FromStr(txtNumMod defs.ITxtFix) *lev0.Result[IModNumFix] {
  37. resNum := txtNumMod.Atoi()
  38. if resNum.IsErr() {
  39. err := defs.Err("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumMod, resNum.Err())
  40. return lev0.NewErr[IModNumFix](err)
  41. }
  42. sf := &moduleNum{
  43. num: AModNum(resNum.Ok()),
  44. }
  45. return lev0.NewOk(IModNumFix(sf))
  46. }
  47. // Get -- получить номер модуля.
  48. func (sf *moduleNum) Get() AModNum {
  49. return sf.num
  50. }
  51. // String -- строковое представление номера модуля.
  52. func (sf *moduleNum) String() string {
  53. return fmt.Sprint(sf.num)
  54. }