]> git.lizzy.rs Git - mt.git/blob - itemmeta.go
Add WaitGroup to SerializePkt
[mt.git] / itemmeta.go
1 package mt
2
3 import (
4         "encoding/json"
5         "strings"
6 )
7
8 type ItemMeta string
9
10 var sanitizer = strings.NewReplacer(
11         string(1), "",
12         string(2), "",
13         string(3), "",
14 )
15
16 func NewItemMeta(fields []Field) ItemMeta {
17         if len(fields) == 0 {
18                 return ""
19         }
20
21         b := new(strings.Builder)
22         b.WriteByte(1)
23         for _, f := range fields {
24                 sanitizer.WriteString(b, f.Name)
25                 b.WriteByte(2)
26                 sanitizer.WriteString(b, f.Value)
27                 b.WriteByte(3)
28         }
29         return ItemMeta(b.String())
30 }
31
32 func (m ItemMeta) Fields() []Field {
33         var f []Field
34         if len(m) > 0 && m[0] == 1 {
35                 m = m[1:]
36                 eat := func(stop byte) string {
37                         if i := strings.IndexByte(string(m), stop); i != -1 {
38                                 defer func() {
39                                         m = m[i+1:]
40                                 }()
41                                 return string(m[:i])
42                         }
43
44                         defer func() {
45                                 m = ""
46                         }()
47                         return string(m)
48                 }
49                 for len(m) > 0 {
50                         f = append(f, Field{eat(2), eat(3)})
51                 }
52                 return f
53         }
54
55         return []Field{{"", string(m)}}
56 }
57
58 func (m ItemMeta) Field(name string) (s string, ok bool) {
59         for _, f := range m.Fields() {
60                 if f.Name == name {
61                         s, ok = f.Value, true
62                 }
63         }
64         return
65 }
66
67 func (m *ItemMeta) SetField(name, value string) {
68         var fields []Field
69         for _, f := range m.Fields() {
70                 if f.Name != name {
71                         fields = append(fields, f)
72                 }
73         }
74         fields = append(fields, Field{name, value})
75         *m = NewItemMeta(fields)
76 }
77
78 func (m ItemMeta) ToolCaps() (ToolCaps, bool) {
79         f, ok := m.Field("tool_capabilities")
80         if !ok {
81                 return ToolCaps{}, false
82         }
83
84         var tc ToolCaps
85         if err := json.Unmarshal([]byte(f), &tc); err != nil {
86                 return tc, false
87         }
88         return tc, true
89 }
90
91 func (m *ItemMeta) SetToolCaps(tc ToolCaps) {
92         b, err := tc.MarshalJSON()
93         if err != nil {
94                 panic(err)
95         }
96
97         m.SetField("tool_capabilities", string(b))
98 }