@@ -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
113122func 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