forked from feather-lang/feather
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobjtype_dict.go
More file actions
70 lines (63 loc) · 1.57 KB
/
objtype_dict.go
File metadata and controls
70 lines (63 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package feather
import "strings"
// DictType is the internal representation for dictionary values.
type DictType struct {
Items map[string]*Obj
Order []string
}
func (t *DictType) Name() string { return "dict" }
func (t *DictType) Dup() ObjType {
newItems := make(map[string]*Obj, len(t.Items))
for k, v := range t.Items {
newItems[k] = v
}
newOrder := make([]string, len(t.Order))
copy(newOrder, t.Order)
return &DictType{Items: newItems, Order: newOrder}
}
func (t *DictType) UpdateString() string {
var result strings.Builder
for i, key := range t.Order {
if i > 0 {
result.WriteByte(' ')
}
// Quote key if needed
if len(key) == 0 || strings.ContainsAny(key, " \t\n{}") {
result.WriteByte('{')
result.WriteString(key)
result.WriteByte('}')
} else {
result.WriteString(key)
}
result.WriteByte(' ')
// Quote value if needed
val := t.Items[key]
s := val.String()
if len(s) == 0 || strings.ContainsAny(s, " \t\n{}") {
result.WriteByte('{')
result.WriteString(s)
result.WriteByte('}')
} else {
result.WriteString(s)
}
}
return result.String()
}
func (t *DictType) IntoDict() (map[string]*Obj, []string, bool) {
return t.Items, t.Order, true
}
func (t *DictType) IntoList() ([]*Obj, bool) {
list := make([]*Obj, 0, len(t.Order)*2)
// Get interpreter from first value (if any) to set on key objects
var interp *Interp
for _, v := range t.Items {
if v != nil && v.interp != nil {
interp = v.interp
break
}
}
for _, k := range t.Order {
list = append(list, &Obj{bytes: k, interp: interp}, t.Items[k])
}
return list, true
}