tuf.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // package tuf -- Text Universal Format
  2. package tuf
  3. import (
  4. "fmt"
  5. "strings"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_err"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/table/owner"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/d0/helpers"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/d0/result"
  11. )
  12. // StrToTuf -- конвертация строки в ITuf.
  13. func StrToTuf(key, val def_spec_base.Txt) def_spec_base.Txt {
  14. keyCheck(key)
  15. txtRes := "ATxt;" + string(key) + ";" + replace(val) + "\n"
  16. return def_spec_base.Txt(txtRes)
  17. }
  18. // BoolToTuf -- конвертация bool в ITuf.
  19. func BoolToTuf(key def_spec_base.Txt, val def_spec_base.Bool) def_spec_base.Txt {
  20. keyCheck(key)
  21. txtRes := "Bool;" + string(key) + ";" + fmt.Sprint(val) + "\n"
  22. return def_spec_base.Txt(txtRes)
  23. }
  24. // RecToTuf -- конвертация записи в TUF.
  25. func RecToTuf(type_, val def_spec_base.Txt) def_spec_base.Txt {
  26. keyCheck(type_)
  27. strRes := "Rec;" + string(type_) + ";" + replace(val) + "\n"
  28. return def_spec_base.Txt(strRes)
  29. }
  30. // RecFromTuf -- конвертация записи из TUF.
  31. func RecFromTuf(owner *owner.LOwner, type_, val def_spec_base.Txt) *result.Result[def_spec_base.Txt] {
  32. keyCheck(type_)
  33. lstField := strings.Split(string(val), ";")
  34. if len(lstField) != 3 {
  35. return result.ResErr[def_spec_base.Txt](
  36. def_err.LetErr(owner, "tuf.RecFromTuf(): valTuf len(%v)!=3", len(lstField)))
  37. }
  38. if lstField[0] != "Rec" {
  39. return result.ResErr[def_spec_base.Txt](
  40. def_err.LetErr(owner, "tuf.RecFromTuf(): valTuf(%v) not record", lstField[0]))
  41. }
  42. if lstField[1] != string(type_) {
  43. return result.ResErr[def_spec_base.Txt](
  44. def_err.LetErr(owner, "tuf.RecFromTuf(): valTuf(%v) not valid type(%v)", lstField[1], type_))
  45. }
  46. txtRes := restore(lstField[2])
  47. return result.ResOk(txtRes)
  48. }
  49. // Проверяет ключ на допустимое значение.
  50. func keyCheck(key def_spec_base.Txt) {
  51. helpers.If(def_spec_base.Bool(strings.Contains(string(key), ";"))).Hassert("tuf.keyCheck(): key contains ';'")
  52. helpers.If(def_spec_base.Bool(strings.Contains(string(key), "\n"))).Hassert("tuf.keyCheck(): key contains '\\n'")
  53. helpers.If(def_spec_base.Bool(strings.Contains(string(key), "="))).Hassert("tuf.keyCheck(): key contains '='")
  54. }
  55. // Заменяет все запрещённые комбинации.
  56. func replace(val def_spec_base.Txt) string {
  57. strVal := strings.ReplaceAll(string(val), "\r", "")
  58. strVal = strings.ReplaceAll(strVal, "\n", "`NL")
  59. strVal = strings.ReplaceAll(strVal, "`", "`TL")
  60. strVal = strings.ReplaceAll(strVal, "=", "`EQ")
  61. strVal = strings.ReplaceAll(strVal, ";", "`CS")
  62. return strVal
  63. }
  64. // Восстанавливает строку.
  65. func restore(val string) def_spec_base.Txt {
  66. strVal := strings.ReplaceAll(val, "`TL", "`")
  67. strVal = strings.ReplaceAll(strVal, "`CS", ";")
  68. strVal = strings.ReplaceAll(strVal, "`EQ", "=")
  69. strVal = strings.ReplaceAll(strVal, "`NL", "\n")
  70. return def_spec_base.Txt(strVal)
  71. }