diff options
Diffstat (limited to 'itemmeta.go')
-rw-r--r-- | itemmeta.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/itemmeta.go b/itemmeta.go new file mode 100644 index 0000000..2282dff --- /dev/null +++ b/itemmeta.go @@ -0,0 +1,74 @@ +package mt + +import "strings" + +type ItemMeta string + +var sanitizer = strings.NewReplacer( + string(1), "", + string(2), "", + string(3), "", +) + +func NewItemMeta(fields []Field) ItemMeta { + if len(fields) == 0 { + return "" + } + + b := new(strings.Builder) + b.WriteByte(1) + for _, f := range fields { + sanitizer.WriteString(b, f.Name) + b.WriteByte(2) + sanitizer.WriteString(b, f.Value) + b.WriteByte(3) + } + return ItemMeta(b.String()) +} + +func (m ItemMeta) Fields() []Field { + var f []Field + if len(m) > 0 && m[0] == 1 { + m = m[1:] + eat := func(stop byte) string { + for i := 0; i < len(m); i++ { + if m[i] == stop { + defer func() { + m = m[i+1:] + }() + return string(m[:i]) + } + } + defer func() { + m = "" + }() + return string(m) + } + for len(m) > 0 { + f = append(f, Field{eat(2), eat(3)}) + } + return f + } + + return []Field{{"", string(m)}} +} + +func (m ItemMeta) Field(name string) (s string, ok bool) { + for _, f := range m.Fields() { + if f.Name == name { + s, ok = f.Value, true + } + } + return +} + +func (m *ItemMeta) SetField(name, value string) { + var fields []Field + for _, f := range m.Fields() { + if f.Name != name { + fields = append(fields, f) + } + } + fields = append(fields, Field{name, value}) + *m = NewItemMeta(fields) +} |