Skip to content

Commit 23df5ea

Browse files
committed
...
1 parent dd41378 commit 23df5ea

File tree

13 files changed

+168
-1023
lines changed

13 files changed

+168
-1023
lines changed

GO_LICENSE

Whitespace-only changes.

assign.go

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

33
import (
4+
"fmt"
45
"reflect"
56
)
67

@@ -12,22 +13,12 @@ func Assign(dst interface{}, ptr JSONPointer, value interface{}) error {
1213
if err := ptr.Validate(); err != nil {
1314
return err
1415
}
15-
16-
// not sure whether or not to delete this. Leaving it out for now.
17-
//
18-
// if ptr == TopLevel {
19-
// return &ptrError{
20-
// err: ErrEmptyJSONPointer,
21-
// typ: reflect.TypeOf(src),
22-
// }
23-
// }
24-
2516
if value == nil {
2617
return Delete(dst, ptr)
2718
}
2819
dv := reflect.ValueOf(dst)
2920
s := newState(ptr, Assigning)
30-
defer s.Done()
21+
defer s.Release()
3122
if dv.Kind() != reflect.Ptr || dv.IsNil() {
3223
return &ptrError{
3324
state: *s,
@@ -36,16 +27,21 @@ func Assign(dst interface{}, ptr JSONPointer, value interface{}) error {
3627
}
3728
}
3829

39-
var tmp reflect.Value
40-
if dv.Type().Elem().Kind() == reflect.Ptr {
41-
tmp = dv
42-
if dv.Elem().IsNil() {
43-
dv = reflect.New(dv.Type().Elem().Elem())
44-
} else {
45-
dv = dv.Elem()
30+
cpy := dv
31+
dv = dv.Elem()
32+
switch dv.Type().Kind() {
33+
case reflect.Ptr:
34+
if dv.IsNil() {
35+
dv = reflect.New(dv.Type().Elem())
36+
}
37+
case reflect.Slice:
38+
if dv.Type().AssignableTo(typeByteSlice) {
39+
fmt.Println("is byte slice")
4640
}
4741
}
48-
res, err := s.assign(dv, reflect.ValueOf(value))
49-
tmp.Elem().Set(res)
42+
dp := reflect.New(dv.Type())
43+
dp.Elem().Set(dv)
44+
res, err := s.assign(dp, reflect.ValueOf(value))
45+
cpy.Elem().Set(res.Elem())
5046
return err
5147
}

assign_test.go

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/chanced/jsonpointer"
8+
"github.com/sanity-io/litter"
89
"github.com/stretchr/testify/require"
910
)
1011

@@ -62,7 +63,7 @@ func TestAssign(t *testing.T) {
6263
}
6364

6465
for i, test := range tests {
65-
fmt.Printf("=== RUN TestAssign#%d, pointer %s\n", i+1, test.ptr)
66+
fmt.Printf("=== RUN TestAssign #%d, pointer %s\n", i+1, test.ptr)
6667
err := jsonpointer.Assign(&r, test.ptr, test.value)
6768
if test.err != nil {
6869
assert.ErrorIs(err, test.err)
@@ -73,3 +74,67 @@ func TestAssign(t *testing.T) {
7374
fmt.Printf("--- PASS TestAssign #%d, pointer %s\n", i, test.ptr)
7475
}
7576
}
77+
78+
func TestAssignAny(t *testing.T) {
79+
assert := require.New(t)
80+
81+
m := map[string]interface{}{}
82+
tests := []struct {
83+
ptr jsonpointer.JSONPointer
84+
value interface{}
85+
err error
86+
run func(v interface{})
87+
}{
88+
{"/nested/str", "strval", nil, func(val interface{}) {
89+
assert.Contains(m, "nested")
90+
assert.Contains(m["nested"], "str")
91+
m := m["nested"].(map[string]interface{})
92+
assert.Equal(val, m["str"])
93+
}},
94+
{"/nestedptr/str", "x", nil, func(val interface{}) {
95+
assert.Contains(m, "nestedptr")
96+
assert.Contains(m["nestedptr"], "str")
97+
n := m["nestedptr"].(map[string]interface{})
98+
assert.Equal(n["str"], "x")
99+
}},
100+
{"/nested/array/0/entry/value", "entry value", nil, func(v interface{}) {
101+
litter.Dump(m)
102+
a := m["nested"].(map[string]interface{})["array"].([]interface{})
103+
assert.Len(a, 1)
104+
mv := a[0].(map[string]interface{})
105+
assert.Contains(mv, "entry")
106+
e := mv["entry"].(map[string]interface{})
107+
assert.Contains(e, "value")
108+
assert.Equal(v, e["value"])
109+
}},
110+
111+
{"/nested/intarray/0", int(1), nil, func(v interface{}) {
112+
}},
113+
{"/nested/anon/value", "val", nil, func(v interface{}) {
114+
}},
115+
{"/nested/strslice/-", "val", nil, func(v interface{}) {
116+
}},
117+
{"/nested/strslice/-", "val2", nil, func(v interface{}) {
118+
}},
119+
{"/nested/custommap/key", "val", nil, func(v interface{}) {
120+
}},
121+
{"/nested/embedded/value", "embed-val", nil, func(v interface{}) {
122+
}},
123+
{"/nested/yield/value", "yielded value", nil, func(v interface{}) {
124+
}},
125+
{"/nested/interface/private/value", uint(3), nil, func(v interface{}) {
126+
}},
127+
}
128+
129+
for i, test := range tests {
130+
fmt.Printf("=== RUN TestAssignAny #%d, pointer %s\n", i, test.ptr)
131+
err := jsonpointer.Assign(&m, test.ptr, test.value)
132+
if test.err != nil {
133+
assert.ErrorIs(err, test.err)
134+
} else {
135+
assert.NoError(err)
136+
test.run(test.value)
137+
}
138+
fmt.Printf("--- PASS TestAssign #%d, pointer %s\n", i, test.ptr)
139+
}
140+
}

delete.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,10 @@ type Deleter interface {
55
}
66

77
func Delete(src interface{}, ptr JSONPointer) error {
8-
panic("not impl")
8+
if err := ptr.Validate(); err != nil {
9+
return err
10+
}
11+
s := newState(ptr, Deleting)
12+
defer s.Release()
13+
panic("not done with Delete")
914
}

errors.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ type valueError struct {
246246
}
247247

248248
func (e *valueError) Error() string {
249-
return e.ptrError.Error() + " " + e.valuetype.String() + " for " + e.typ.String()
249+
return fmt.Sprintf("%v (%v) for reference \"%v\"; expected %v", e.ptrError.err, e.valuetype, e.ptr, e.typ)
250250
}
251251

252252
func (e *valueError) ValueType() reflect.Type {
@@ -293,7 +293,7 @@ func (e *indexError) Index() int {
293293

294294
func (e *indexError) Error() string {
295295
if errors.Is(e.err, ErrOutOfRange) {
296-
return fmt.Sprintf("%v; expected index to be less than next (%d) but is (%d)", ErrOutOfRange, e.maxIndex, e.index)
296+
return fmt.Sprintf("%v; expected index to be equal to or less than next (%d) but is (%d)", ErrOutOfRange, e.maxIndex, e.index)
297297
}
298298
return fmt.Sprintf("%v for index %d of %d", e.err.Error(), e.index, e.maxIndex)
299299
}

resolve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func Resolve(src interface{}, ptr JSONPointer, dst interface{}) error {
1212
}
1313
dv := reflect.ValueOf(dst)
1414
s := newState(ptr, Resolving)
15-
defer s.Done()
15+
defer s.Release()
1616
if dv.Kind() != reflect.Ptr || dv.IsNil() {
1717
return &ptrError{
1818
state: *s,

0 commit comments

Comments
 (0)