mod_num.go 1.6 KB

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