| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // package tuf -- Text Universal Format
- package tuf
- import (
- "fmt"
- "strings"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
- )
- // StrToTuf -- конвертация строки в ITuf.
- func StrToTuf(key, val def_spec_base.Txt) def_spec_base.Txt {
- keyCheck(key)
- txtRes := "ATxt;" + string(key) + ";" + replace(val) + "\n"
- return def_spec_base.Txt(txtRes)
- }
- // BoolToTuf -- конвертация bool в ITuf.
- func BoolToTuf(key def_spec_base.Txt, val def_spec_base.Bool) def_spec_base.Txt {
- keyCheck(key)
- txtRes := "Bool;" + string(key) + ";" + fmt.Sprint(val) + "\n"
- return def_spec_base.Txt(txtRes)
- }
- // RecToTuf -- конвертация записи в TUF.
- func RecToTuf(type_, val def_spec_base.Txt) def_spec_base.Txt {
- keyCheck(type_)
- strRes := "Rec;" + string(type_) + ";" + replace(val) + "\n"
- return def_spec_base.Txt(strRes)
- }
- // RecFromTuf -- конвертация записи из TUF.
- func RecFromTuf(type_, val def_spec_base.Txt) *result.Result[def_spec_base.Txt] {
- keyCheck(type_)
- lstField := strings.Split(string(val), ";")
- if len(lstField) != 3 {
- return result.ResErr[def_spec_base.Txt](
- def_err.LetErr("tuf.RecFromTuf(): valTuf len(%v)!=3", len(lstField)))
- }
- if lstField[0] != "Rec" {
- return result.ResErr[def_spec_base.Txt](
- def_err.LetErr("tuf.RecFromTuf(): valTuf(%v) not record", lstField[0]))
- }
- if lstField[1] != string(type_) {
- return result.ResErr[def_spec_base.Txt](
- def_err.LetErr("tuf.RecFromTuf(): valTuf(%v) not valid type(%v)", lstField[1], type_))
- }
- txtRes := restore(lstField[2])
- return result.ResOk(txtRes)
- }
- // Проверяет ключ на допустимое значение.
- func keyCheck(key def_spec_base.Txt) {
- helpers.If(def_spec_base.Bool(strings.Contains(string(key), ";"))).Hassert("tuf.keyCheck(): key contains ';'")
- helpers.If(def_spec_base.Bool(strings.Contains(string(key), "\n"))).Hassert("tuf.keyCheck(): key contains '\\n'")
- helpers.If(def_spec_base.Bool(strings.Contains(string(key), "="))).Hassert("tuf.keyCheck(): key contains '='")
- }
- // Заменяет все запрещённые комбинации.
- func replace(val def_spec_base.Txt) string {
- strVal := strings.ReplaceAll(string(val), "\r", "")
- strVal = strings.ReplaceAll(strVal, "\n", "`NL")
- strVal = strings.ReplaceAll(strVal, "`", "`TL")
- strVal = strings.ReplaceAll(strVal, "=", "`EQ")
- strVal = strings.ReplaceAll(strVal, ";", "`CS")
- return strVal
- }
- // Восстанавливает строку.
- func restore(val string) def_spec_base.Txt {
- strVal := strings.ReplaceAll(val, "`TL", "`")
- strVal = strings.ReplaceAll(strVal, "`CS", ";")
- strVal = strings.ReplaceAll(strVal, "`EQ", "=")
- strVal = strings.ReplaceAll(strVal, "`NL", "\n")
- return def_spec_base.Txt(strVal)
- }
|