summaryrefslogtreecommitdiff
path: root/itemmeta.go
diff options
context:
space:
mode:
Diffstat (limited to 'itemmeta.go')
-rw-r--r--itemmeta.go74
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)
+}