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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
package toml
type Map struct {
Var Var
m map[string]Map
}
func (m Map) Set(key []string, v Var) bool {
currentMap := m
for idx, sk := range key {
subMap, ok := currentMap.m[sk]
if subMap.Var == BasicVar {
return false
}
if idx == len(key)-1 {
if ok {
if subMap.Var == ImplicitTableVar && v == TableVar {
subMap.Var = TableVar
} else if subMap.Var != ArrayVar {
return false
}
} else {
subMap.Var = v
}
currentMap.m[sk] = subMap
return true
}
if !ok {
subMap.Var = ImplicitTableVar
}
if subMap.m == nil {
subMap.m = make(map[string]Map)
}
currentMap.m[sk] = subMap
currentMap = subMap
}
return true
}
func (m Map) Get(key []string) (Map, bool) {
currentMap := m
for _, sk := range key {
if currentMap.m == nil {
return Map{}, false
}
subMap, ok := currentMap.m[sk]
if !ok {
return Map{}, false
}
currentMap = subMap
}
return currentMap, true
}
func (m Map) Clear(key []string) bool {
currentMap := m
for idx, sk := range key {
if currentMap.m == nil {
return false
}
subMap, ok := currentMap.m[sk]
if !ok {
return false
}
if idx == len(key)-1 {
for k := range subMap.m {
delete(subMap.m, k)
}
return true
}
currentMap = subMap
}
return false
}
|