tuf.go 2.8 KB

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