package models import ( "bytes" "errors" "fmt" "regexp" "codeberg.org/danjones000/my-log/tools" ) type Meta struct { Key string Value any } func (m Meta) MarshalText() ([]byte, error) { if regexp.MustCompile(`\s`).MatchString(m.Key) { return []byte{}, fmt.Errorf("whitespace is not allowed in key: %s", m.Key) } buff := &bytes.Buffer{} buff.WriteRune('@') buff.WriteString(m.Key) buff.WriteRune(' ') n, err := tools.WriteValue(buff, m.Value) if n == 0 || err != nil { return []byte{}, err } return buff.Bytes(), nil } func (m *Meta) UnmarshalText(in []byte) error { if len(in) == 0 { return newParsingError(errors.New("Unable to Unmarshal empty string")) } re := regexp.MustCompile("(?s)^@([^ ]+) (.*)( @end)?$") match := re.FindSubmatch(in) if len(match) == 0 { return newParsingError(fmt.Errorf("Failed to match %s", in)) } m.Key = string(match[1]) return m.processMeta(match[2]) } func (m *Meta) processMeta(in []byte) error { if len(in) == 0 { return newParsingError(errors.New("No value found")) } v := tools.ParseBytes(in) if v == "" { return newParsingError(errors.New("No value found")) } m.Value = v return nil }