Skip to content

Commit f7d1bab

Browse files
committed
wip
1 parent 23df5ea commit f7d1bab

File tree

4 files changed

+80
-86
lines changed

4 files changed

+80
-86
lines changed

assign_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ func TestAssignAny(t *testing.T) {
9898
assert.Equal(n["str"], "x")
9999
}},
100100
{"/nested/array/0/entry/value", "entry value", nil, func(v interface{}) {
101-
litter.Dump(m)
102101
a := m["nested"].(map[string]interface{})["array"].([]interface{})
103102
assert.Len(a, 1)
104103
mv := a[0].(map[string]interface{})
@@ -109,12 +108,19 @@ func TestAssignAny(t *testing.T) {
109108
}},
110109

111110
{"/nested/intarray/0", int(1), nil, func(v interface{}) {
112-
}},
113-
{"/nested/anon/value", "val", nil, func(v interface{}) {
111+
a := m["nested"].(map[string]interface{})["intarray"].([]interface{})
112+
assert.Len(a, 1)
113+
assert.Equal(v, a[0])
114114
}},
115115
{"/nested/strslice/-", "val", nil, func(v interface{}) {
116+
a := m["nested"].(map[string]interface{})["strslice"].([]interface{})
117+
assert.Len(a, 1)
118+
assert.Equal(v, a[0])
116119
}},
117120
{"/nested/strslice/-", "val2", nil, func(v interface{}) {
121+
a := m["nested"].(map[string]interface{})["strslice"].([]interface{})
122+
assert.Len(a, 2)
123+
assert.Equal(v, a[1])
118124
}},
119125
{"/nested/custommap/key", "val", nil, func(v interface{}) {
120126
}},
@@ -137,4 +143,5 @@ func TestAssignAny(t *testing.T) {
137143
}
138144
fmt.Printf("--- PASS TestAssign #%d, pointer %s\n", i, test.ptr)
139145
}
146+
litter.Dump(m)
140147
}

state.go

Lines changed: 51 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type state struct {
4545
}
4646

4747
func (s *state) Release() {
48-
statePool.Put(&s)
48+
statePool.Put(s)
4949
}
5050

5151
func (s state) Operation() Operation {
@@ -271,82 +271,80 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
271271
return reflect.Value{}, fmt.Errorf("unexpected end of JSON pointer %v", cur)
272272
}
273273
// new dst
274-
var nd reflect.Value
275-
nd, err = s.resolveNext(dst, t)
274+
var rn reflect.Value
275+
rn, err = s.resolveNext(dst, t)
276276
if err != nil {
277-
return nd, err
277+
return rn, err
278278
}
279279

280280
shouldSet := false
281-
switch nd.Kind() {
281+
switch rn.Kind() {
282282
case reflect.Interface:
283-
if !nd.IsNil() && nd.Type() == typeAny {
284-
nd = nd.Elem()
283+
if !rn.IsNil() && rn.Type() == typeAny {
284+
rn = rn.Elem()
285285
}
286286
case reflect.Ptr:
287-
if nd.IsNil() {
288-
nd.Set(reflect.New(nd.Type().Elem()))
287+
if rn.IsNil() {
288+
rn.Set(reflect.New(rn.Type().Elem()))
289289
}
290290
case reflect.Map:
291-
if nd.IsNil() {
292-
nd.Set(reflect.MakeMap(nd.Type()))
291+
if rn.IsNil() {
292+
rn.Set(reflect.MakeMap(rn.Type()))
293293
}
294294
case reflect.Slice:
295-
if nd.IsNil() {
296-
nd.Set(reflect.MakeSlice(nd.Type(), 0, 1))
295+
if rn.IsNil() {
296+
rn.Set(reflect.MakeSlice(rn.Type(), 0, 1))
297297
}
298298
case reflect.Invalid:
299299
switch dst.Type().Elem().Kind() {
300-
case reflect.Map:
300+
case reflect.Map, reflect.Slice:
301301
shouldSet = true
302-
nd = reflect.Zero(dst.Type().Elem().Elem())
303-
if nd.Kind() == reflect.Ptr && nd.IsNil() {
304-
nd = reflect.New(nd.Type().Elem())
302+
rn = reflect.Zero(dst.Type().Elem().Elem())
303+
if rn.Kind() == reflect.Ptr && rn.IsNil() {
304+
rn = reflect.New(rn.Type().Elem())
305305
// so this works
306-
} else if nd.Type() == typeAny && nd.IsNil() {
307-
fmt.Printf("\ttoken: %v\n\t\tcurrent: %v\n\t\troot: %v\n", t, s.current, s.current.IsRoot())
308-
switch {
309-
case s.current.IsRoot():
310-
nd = reflect.Zero(val.Type())
311-
case t.IsIndexable():
312-
nd = reflect.MakeSlice(typeAnySlice, 0, 1)
313-
default:
314-
nd = reflect.MakeMap(typeAnyMap)
306+
} else if rn.Type() == typeAny && rn.IsNil() {
307+
nt, ok := s.current.NextToken()
308+
if !ok {
309+
rn = reflect.Zero(val.Type())
310+
} else {
311+
if _, err = nt.Index(0); err == nil {
312+
rn = reflect.MakeSlice(typeAnySlice, 0, 1)
313+
} else {
314+
rn = reflect.MakeMap(typeAnyMap)
315+
}
315316
}
316317
}
317-
case reflect.Slice:
318-
shouldSet = true
319-
if err != nil {
320-
return reflect.Value{}, newError(err, *s, dst.Type())
321-
}
322-
nd = reflect.Zero(dst.Type().Elem().Elem())
323-
if nd.Kind() == reflect.Ptr && nd.IsNil() {
324-
nd = reflect.New(nd.Type().Elem())
325-
}
326318
case reflect.Interface:
327-
if nd.Type() == typeAny {
328-
switch {
329-
case s.current.IsRoot():
330-
nd = reflect.Zero(val.Type())
331-
case t.IsIndexable():
332-
nd = reflect.MakeSlice(typeAnySlice, 0, 1)
333-
default:
334-
nd = reflect.MakeMap(typeAnyMap)
319+
_, nt, ok := s.current.Next()
320+
if !ok {
321+
panic("pointer is not ok")
322+
}
323+
if rn.Type() == typeAny {
324+
if s.current.IsRoot() {
325+
rn = reflect.Zero(val.Type())
326+
} else {
327+
if _, err = nt.Index(0); err == nil {
328+
rn = reflect.MakeSlice(typeAnySlice, 0, 1)
329+
} else {
330+
rn = reflect.MakeMap(typeAnyMap)
331+
}
335332
}
336333
}
337334
default:
338335
return reflect.Value{}, newError(ErrUnreachable, *s, dst.Type())
339336
}
340337
}
341-
if nd.CanAddr() {
342-
nd = nd.Addr()
338+
339+
if rn.CanAddr() {
340+
rn = rn.Addr()
343341
} else {
344-
pv := reflect.New(nd.Type())
345-
pv.Elem().Set(nd)
346-
nd = pv
342+
pv := reflect.New(rn.Type())
343+
pv.Elem().Set(rn)
344+
rn = pv
347345
}
348346
var nv reflect.Value
349-
nv, err = s.assign(nd, val)
347+
nv, err = s.assign(rn, val)
350348

351349
s.current = s.current.Prepend(t)
352350
if err != nil {
@@ -385,16 +383,16 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
385383
s.current = cur
386384
}
387385
}
388-
nd, err = s.assignValue(nd, nv.Elem())
386+
rn, err = s.assignValue(rn, nv.Elem())
389387
if err != nil {
390-
return nd, err
388+
return rn, err
391389
}
392390
if shouldSet {
393391
switch dst.Elem().Kind() {
394392
case reflect.Map:
395-
s.setMapIndex(dst.Elem(), t, nd.Elem())
393+
s.setMapIndex(dst.Elem(), t, rn.Elem())
396394
case reflect.Slice:
397-
s.setSliceIndex(dst.Elem(), t, nd.Elem())
395+
s.setSliceIndex(dst.Elem(), t, rn.Elem())
398396
}
399397
}
400398
return dst, nil

token.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,6 @@ func (t Token) Uint64() (uint64, error) {
3131
return strconv.ParseUint(t.String(), 10, 64)
3232
}
3333

34-
func (t Token) IsIndexable() bool {
35-
if t == "-" {
36-
return true
37-
}
38-
if i, err := t.Int(); err == nil {
39-
return i >= 0
40-
}
41-
return false
42-
}
43-
4434
func (t Token) Int() (int, error) {
4535
return strconv.Atoi(t.String())
4636
}

token_test.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package jsonpointer_test
22

33
import (
4-
"fmt"
54
"testing"
65

76
"github.com/chanced/jsonpointer"
@@ -46,23 +45,23 @@ func TestTokenString(t *testing.T) {
4645
assert.Equal("~/", token.String())
4746
}
4847

49-
func TestTokenIsIndexable(t *testing.T) {
50-
assert := require.New(t)
51-
tests := []struct {
52-
token jsonpointer.Token
53-
expected bool
54-
}{
55-
{"1", true},
56-
{"-1", false},
57-
{"-", true},
58-
{"0", true},
59-
{"c", false},
60-
{"", false},
61-
}
48+
// func TestTokenIsIndexable(t *testing.T) {
49+
// assert := require.New(t)
50+
// tests := []struct {
51+
// token jsonpointer.Token
52+
// expected bool
53+
// }{
54+
// {"1", true},
55+
// {"-1", false},
56+
// {"-", true},
57+
// {"0", true},
58+
// {"c", false},
59+
// {"", false},
60+
// }
6261

63-
for i, t := range tests {
64-
fmt.Println("=== TestTokenIsIndexable #", i, "token:", t.token)
65-
assert.Equal(t.expected, t.token.IsIndexable(), "test %d", i)
66-
fmt.Println("--- PASS TestTokenIsIndexable #", i)
67-
}
68-
}
62+
// for i, t := range tests {
63+
// fmt.Println("=== TestTokenIsIndexable #", i, "token:", t.token)
64+
// assert.Equal(t.expected, t.token.IsIndexable(), "test %d", i)
65+
// fmt.Println("--- PASS TestTokenIsIndexable #", i)
66+
// }
67+
// }

0 commit comments

Comments
 (0)