Skip to content

Commit 0288ca9

Browse files
committed
resolves map[string]interface{} and []interface{}
1 parent f7d1bab commit 0288ca9

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

assign_test.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,13 @@ func TestAssign(t *testing.T) {
3333
{"/nested/strarray/1", "strval", nil, func(v interface{}) {
3434
assert.Equal(v, r.Nested.StrArray[1])
3535
}},
36-
{"/nested/intarray/1", int(1), nil, func(v interface{}) {
36+
{"/nested/intarray/1", 1, nil, func(v interface{}) {
3737
assert.Equal(v, r.Nested.IntArray[1])
3838
}},
39+
{"/nested/intarray/2", 3, nil, func(v interface{}) {
40+
assert.Equal(v, r.Nested.IntArray[2])
41+
}},
42+
{"/nested/intarray/3", 3, jsonpointer.ErrOutOfRange, nil},
3943
{"/nested/anon/value", "val", nil, func(v interface{}) {
4044
assert.Equal(v, r.Nested.AnonStruct.Value)
4145
}},
@@ -117,19 +121,11 @@ func TestAssignAny(t *testing.T) {
117121
assert.Len(a, 1)
118122
assert.Equal(v, a[0])
119123
}},
120-
{"/nested/strslice/-", "val2", nil, func(v interface{}) {
124+
{"/nested/strslice/1", "val2", nil, func(v interface{}) {
121125
a := m["nested"].(map[string]interface{})["strslice"].([]interface{})
122126
assert.Len(a, 2)
123127
assert.Equal(v, a[1])
124128
}},
125-
{"/nested/custommap/key", "val", nil, func(v interface{}) {
126-
}},
127-
{"/nested/embedded/value", "embed-val", nil, func(v interface{}) {
128-
}},
129-
{"/nested/yield/value", "yielded value", nil, func(v interface{}) {
130-
}},
131-
{"/nested/interface/private/value", uint(3), nil, func(v interface{}) {
132-
}},
133129
}
134130

135131
for i, test := range tests {

state.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
277277
return rn, err
278278
}
279279

280-
shouldSet := false
280+
// shouldSet := false
281281
switch rn.Kind() {
282282
case reflect.Interface:
283283
if !rn.IsNil() && rn.Type() == typeAny {
@@ -298,7 +298,7 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
298298
case reflect.Invalid:
299299
switch dst.Type().Elem().Kind() {
300300
case reflect.Map, reflect.Slice:
301-
shouldSet = true
301+
// shouldSet = true
302302
rn = reflect.Zero(dst.Type().Elem().Elem())
303303
if rn.Kind() == reflect.Ptr && rn.IsNil() {
304304
rn = reflect.New(rn.Type().Elem())
@@ -387,13 +387,13 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
387387
if err != nil {
388388
return rn, err
389389
}
390-
if shouldSet {
391-
switch dst.Elem().Kind() {
392-
case reflect.Map:
393-
s.setMapIndex(dst.Elem(), t, rn.Elem())
394-
case reflect.Slice:
395-
s.setSliceIndex(dst.Elem(), t, rn.Elem())
396-
}
390+
// if shouldSet {
391+
switch dst.Elem().Kind() {
392+
case reflect.Map:
393+
s.setMapIndex(dst.Elem(), t, rn.Elem())
394+
case reflect.Slice:
395+
396+
s.setSliceIndex(dst, t, rn.Elem())
397397
}
398398
return dst, nil
399399
}
@@ -517,15 +517,18 @@ func (s *state) mapKey(src reflect.Value, t Token) (reflect.Value, error) {
517517
}
518518

519519
func (s *state) setSliceIndex(l reflect.Value, token Token, v reflect.Value) error {
520-
i, err := s.sliceIndex(l, token)
520+
i, err := s.sliceIndex(l.Elem(), token)
521521
if err != nil {
522522
return err
523523
}
524-
if i >= l.Len() {
525-
l.Set(reflect.Append(l, v))
524+
if i >= l.Elem().Len() {
525+
l.Elem().Set(reflect.Append(l.Elem(), v))
526526
return nil
527+
} else {
528+
nl := l.Elem()
529+
nl.Index(i).Set(v)
530+
l.Set(nl)
527531
}
528-
l.Index(i).Set(v)
529532
return nil
530533
}
531534

0 commit comments

Comments
 (0)