diff options
author | anon5 <anon5clam@protonmail.com> | 2021-02-24 12:23:42 +0000 |
---|---|---|
committer | anon5 <anon5clam@protonmail.com> | 2021-02-24 12:23:42 +0000 |
commit | 27c0776cb2f1084356df5c9f6080fecf20f8fddf (patch) | |
tree | c0f9f3c3f660ca873d155b8b14bfef243c3485c5 | |
parent | 4896d8f03c3f9bf8244f2f703a0ae28336c48a2a (diff) |
Improve item meta handling
-rw-r--r-- | itemmeta.go | 74 | ||||
-rw-r--r-- | mt.go | 5 | ||||
-rw-r--r-- | stack.go | 35 |
3 files changed, 79 insertions, 35 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) +} @@ -0,0 +1,5 @@ +package mt + +type Field struct { + Name, Value string +} @@ -22,41 +22,6 @@ type Item struct { ItemMeta } -type ItemMeta string - -func (m ItemMeta) Field(name string) (s string, ok bool) { - 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 { - if eat(2) == name { - s = eat(3) - ok = true - } - } - return - } - - if name == "" { - return string(m), true - } - - return "", false -} - func (s Stack) String() string { if s.Count == 0 { return "" |