Skip to content

Commit 20a087f

Browse files
Merge pull request #20 from the-hotels-network/fix-data-set
Fix data set
2 parents 7f00c1e + e25fdd2 commit 20a087f

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

data.go

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,20 @@ func get(row Row, parts []string) (any, bool) {
7272
var current any = row
7373

7474
for _, part := range parts {
75-
r, ok := current.(Row)
76-
if !ok {
77-
return nil, false
78-
}
79-
80-
current, ok = r[part]
81-
if !ok {
75+
switch v := current.(type) {
76+
case Row:
77+
val, ok := v[part]
78+
if !ok {
79+
return nil, false
80+
}
81+
current = val
82+
case map[string]any:
83+
val, ok := v[part]
84+
if !ok {
85+
return nil, false
86+
}
87+
current = val
88+
default:
8289
return nil, false
8390
}
8491
}
@@ -97,42 +104,46 @@ func (d *Data) Set(in string, value any) error {
97104
return errors.New("nil Data")
98105
}
99106

107+
if len(*d) == 0 {
108+
return errors.New("empty Data")
109+
}
110+
100111
parts := strings.Split(in, ".")
101112

102113
for i := range *d {
103-
row := (*d)[i]
104-
105-
if _, ok := get(row, parts[:len(parts)-1]); ok {
106-
return set(row, parts, value)
114+
if err := set((*d)[i], parts, value); err != nil {
115+
return err
107116
}
108117
}
109118

110-
return errors.New("path not found")
119+
return nil
111120
}
112121

113122
func set(row Row, parts []string, value any) error {
114123
current := row
115124

116-
for i, p := range parts {
117-
if i == len(parts)-1 {
118-
current[p] = value
125+
for index, part := range parts {
126+
if index == len(parts)-1 {
127+
current[part] = value
119128
return nil
120129
}
121130

122-
next, exists := current[p]
131+
next, exists := current[part]
123132
if !exists {
124133
child := Row{}
125-
current[p] = child
134+
current[part] = child
126135
current = child
127136
continue
128137
}
129138

130-
child, ok := next.(Row)
131-
if !ok {
132-
return errors.New("path collision at " + p)
139+
switch v := next.(type) {
140+
case Row:
141+
current = v
142+
case map[string]any:
143+
current = Row(v)
144+
default:
145+
return errors.New("path collision at " + part)
133146
}
134-
135-
current = child
136147
}
137148

138149
return nil

0 commit comments

Comments
 (0)