def_txt_mut.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package def_txt
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_fn"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/table/owner"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/d0/result"
  10. )
  11. // MTxt -- внутренней изменяемый текст.
  12. type MTxt struct {
  13. *LTxt
  14. }
  15. // MutTxt -- создать новый внутренний изменяемый текст.
  16. func MutTxt[T def_spec_fn.TxtConstraint](owner *owner.LOwner, msg T, arg ...any) *MTxt {
  17. sf := &MTxt{
  18. LTxt: LetTxt(owner, msg, arg...),
  19. }
  20. return sf
  21. }
  22. // Add -- добавить изменяемый текст.
  23. func (sf *MTxt) Add(msg any, arg ...any) def_spec_base.Txt {
  24. sf.CheckOwner()
  25. val := fmt.Sprintf("%v", msg)
  26. val = fmt.Sprintf(val, arg...)
  27. sf.val.WriteString(val)
  28. return def_spec_base.Txt(sf.val.String())
  29. }
  30. // TrimSuffix -- обрезает суффикс неизменяемого текста.
  31. func (sf *MTxt) TrimSuffix[T def_spec_fn.TxtConstraint](suffix T) def_spec_base.Txt {
  32. suf := fmt.Sprintf("%v", suffix)
  33. txt := strings.TrimSuffix(sf.val.String(), suf)
  34. sf.val.Reset()
  35. sf.val.WriteString(txt)
  36. return def_spec_base.Txt(sf.val.String())
  37. }
  38. // Atoi -- устанавливает и возвращает возможное число.
  39. func (sf MTxt) Atoi() *result.Result[def_spec_base.Num] {
  40. sf.CheckOwner()
  41. fnCut := func(val string) string {
  42. for len(val) > 0 {
  43. isCut := false
  44. litBeg := string([]rune(val)[0])
  45. if litBeg == " " || litBeg == "\t" || litBeg == "\n" {
  46. val = val[1:]
  47. isCut = true
  48. }
  49. runes := []rune(val)
  50. litEnd := string(runes[len(runes)-1])
  51. if litEnd == " " || litEnd == "\t" || litEnd == "\n" {
  52. val = string(runes[:len(runes)-1])
  53. isCut = true
  54. }
  55. if !isCut {
  56. break
  57. }
  58. }
  59. return val
  60. }
  61. val := sf.Str()
  62. val = fnCut(val)
  63. sf.Set(val)
  64. iRes, err := strconv.Atoi(sf.Str())
  65. if err != nil {
  66. err := fmt.Errorf("LetTxt.Atoi(): val(%q) not Int, err=\n\t%w",
  67. sf.String(), err)
  68. return result.ResErr[def_spec_base.Num](err)
  69. }
  70. sf.val.Reset()
  71. sf.val.WriteString(fmt.Sprintf("%v", iRes))
  72. return result.ResOk(def_spec_base.Num(iRes))
  73. }
  74. // Set -- изменение внутренней строки.
  75. func (sf *MTxt) Set[T def_spec_fn.TxtConstraint](msg T, arg ...any) {
  76. _msg := fmt.Sprintf(string(msg), arg...)
  77. sf.val.Reset()
  78. sf.val.WriteString(_msg)
  79. }
  80. // Let -- возвращает неизменяемую копию себя
  81. func (sf *MTxt) Let() *LTxt {
  82. return sf.LTxt
  83. }