]> git.lizzy.rs Git - mt.git/blob - itemmeta.go
Improve item meta handling
[mt.git] / itemmeta.go
1 package mt
2
3 import "strings"
4
5 type ItemMeta string
6
7 var sanitizer = strings.NewReplacer(
8         string(1), "",
9         string(2), "",
10         string(3), "",
11 )
12
13 func NewItemMeta(fields []Field) ItemMeta {
14         if len(fields) == 0 {
15                 return ""
16         }
17
18         b := new(strings.Builder)
19         b.WriteByte(1)
20         for _, f := range fields {
21                 sanitizer.WriteString(b, f.Name)
22                 b.WriteByte(2)
23                 sanitizer.WriteString(b, f.Value)
24                 b.WriteByte(3)
25         }
26         return ItemMeta(b.String())
27 }
28
29 func (m ItemMeta) Fields() []Field {
30         var f []Field
31         if len(m) > 0 && m[0] == 1 {
32                 m = m[1:]
33                 eat := func(stop byte) string {
34                         for i := 0; i < len(m); i++ {
35                                 if m[i] == stop {
36                                         defer func() {
37                                                 m = m[i+1:]
38                                         }()
39                                         return string(m[:i])
40                                 }
41                         }
42                         defer func() {
43                                 m = ""
44                         }()
45                         return string(m)
46                 }
47                 for len(m) > 0 {
48                         f = append(f, Field{eat(2), eat(3)})
49                 }
50                 return f
51         }
52
53         return []Field{{"", string(m)}}
54 }
55
56 func (m ItemMeta) Field(name string) (s string, ok bool) {
57         for _, f := range m.Fields() {
58                 if f.Name == name {
59                         s, ok = f.Value, true
60                 }
61         }
62         return
63 }
64
65 func (m *ItemMeta) SetField(name, value string) {
66         var fields []Field
67         for _, f := range m.Fields() {
68                 if f.Name != name {
69                         fields = append(fields, f)
70                 }
71         }
72         fields = append(fields, Field{name, value})
73         *m = NewItemMeta(fields)
74 }