summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoranon5 <anon5clam@protonmail.com>2021-02-24 12:23:42 +0000
committeranon5 <anon5clam@protonmail.com>2021-02-24 12:23:42 +0000
commit27c0776cb2f1084356df5c9f6080fecf20f8fddf (patch)
treec0f9f3c3f660ca873d155b8b14bfef243c3485c5
parent4896d8f03c3f9bf8244f2f703a0ae28336c48a2a (diff)
Improve item meta handling
-rw-r--r--itemmeta.go74
-rw-r--r--mt.go5
-rw-r--r--stack.go35
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)
+}
diff --git a/mt.go b/mt.go
new file mode 100644
index 0000000..c5d665d
--- /dev/null
+++ b/mt.go
@@ -0,0 +1,5 @@
+package mt
+
+type Field struct {
+ Name, Value string
+}
diff --git a/stack.go b/stack.go
index 12c6338..4e7cc18 100644
--- a/stack.go
+++ b/stack.go
@@ -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 ""