mod_num.go 1.5 KB

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