my-log/models/meta.go
2024-03-03 13:56:48 -06:00

57 lines
1.1 KiB
Go

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
}