Skip to content

Commit 64c5f72

Browse files
committed
wip
1 parent 4f6d8b0 commit 64c5f72

File tree

8 files changed

+446
-362
lines changed

8 files changed

+446
-362
lines changed

assign.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package jsonpointer
22

3-
import "reflect"
3+
import (
4+
"reflect"
5+
)
46

57
type Assigner interface {
68
AssignByJSONPointer(ptr *JSONPointer, value interface{}) error
79
}
810

9-
func Assign(ptr JSONPointer, src interface{}, value interface{}) error {
11+
func Assign(dst interface{}, ptr JSONPointer, value interface{}) error {
1012
if err := ptr.Validate(); err != nil {
1113
return err
1214
}
@@ -21,19 +23,29 @@ func Assign(ptr JSONPointer, src interface{}, value interface{}) error {
2123
// }
2224

2325
if value == nil {
24-
return Delete(src, ptr)
26+
return Delete(dst, ptr)
2527
}
26-
sv := reflect.ValueOf(src)
28+
dv := reflect.ValueOf(dst)
2729
s := newState(ptr, Assigning)
2830
defer s.Done()
29-
if sv.Kind() != reflect.Ptr || sv.IsNil() {
31+
if dv.Kind() != reflect.Ptr || dv.IsNil() {
3032
return &ptrError{
3133
state: *s,
3234
err: ErrNonPointer,
33-
typ: sv.Type(),
35+
typ: dv.Type(),
3436
}
3537
}
36-
// TODO: Handle bytes / reader
37-
_, err := s.assign(sv, reflect.ValueOf(value))
38+
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()
46+
}
47+
}
48+
res, err := s.assign(dv, reflect.ValueOf(value))
49+
tmp.Elem().Set(res)
3850
return err
3951
}

assign_test.go

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,52 +11,65 @@ import (
1111
func TestAssign(t *testing.T) {
1212
assert := require.New(t)
1313

14-
r := Root{}
14+
var r *Root
1515

1616
tests := []struct {
1717
ptr jsonpointer.JSONPointer
1818
value interface{}
1919
err error
2020
run func(v interface{})
2121
}{
22-
{"/nested/str", "strval", nil, func(val interface{}) {
23-
assert.Equal(val, r.Nested.String)
24-
}},
25-
{"/nestedptr/str", "x", nil, func(val interface{}) {
26-
assert.Equal(val, r.NestedPtr.String)
27-
}},
28-
{"/nested/entrymap/keyval/name", "entry-name", nil, func(v interface{}) {
29-
assert.Contains(r.Nested.EntryMap, "keyval")
30-
assert.Equal("entry-name", r.Nested.EntryMap["keyval"].Name)
31-
}},
32-
{"/nested/strarray/1", "strval", nil, func(v interface{}) {
33-
assert.Equal(v, r.Nested.StrArray[1])
34-
}},
35-
{"/nested/intarray/1", int(1), nil, func(v interface{}) {
36-
assert.Equal(v, r.Nested.IntArray[1])
37-
}},
38-
{"/nested/anon/value", "val", nil, func(v interface{}) {
39-
assert.Equal(v, r.Nested.AnonStruct.Value)
40-
}},
41-
{"/nested/strslice/-", "val", nil, func(v interface{}) {
42-
assert.Len(r.Nested.StrSlice, 1)
43-
assert.Equal(v, r.Nested.StrSlice[0])
44-
}},
45-
{"/nested/strslice/-", "val2", nil, func(v interface{}) {
46-
assert.Len(r.Nested.StrSlice, 2)
47-
assert.Equal(v, r.Nested.StrSlice[1])
22+
// {"/nested/str", "strval", nil, func(val interface{}) {
23+
// assert.Equal(val, r.Nested.String)
24+
// }},
25+
// {"/nestedptr/str", "x", nil, func(val interface{}) {
26+
// assert.Equal(val, r.NestedPtr.String)
27+
// }},
28+
// {"/nested/entrymap/keyval/name", "entry-name", nil, func(v interface{}) {
29+
// assert.Contains(r.Nested.EntryMap, "keyval")
30+
// assert.Equal("entry-name", r.Nested.EntryMap["keyval"].Name)
31+
// }},
32+
// {"/nested/strarray/1", "strval", nil, func(v interface{}) {
33+
// assert.Equal(v, r.Nested.StrArray[1])
34+
// }},
35+
// {"/nested/intarray/1", int(1), nil, func(v interface{}) {
36+
// assert.Equal(v, r.Nested.IntArray[1])
37+
// }},
38+
// {"/nested/anon/value", "val", nil, func(v interface{}) {
39+
// assert.Equal(v, r.Nested.AnonStruct.Value)
40+
// }},
41+
// {"/nested/strslice/-", "val", nil, func(v interface{}) {
42+
// assert.Len(r.Nested.StrSlice, 1)
43+
// assert.Equal(v, r.Nested.StrSlice[0])
44+
// }},
45+
// {"/nested/strslice/-", "val2", nil, func(v interface{}) {
46+
// assert.Len(r.Nested.StrSlice, 2)
47+
// assert.Equal(v, r.Nested.StrSlice[1])
48+
// }},
49+
// {"/nested/custommap/key", "val", nil, func(v interface{}) {
50+
// assert.Len(r.Nested.CustomMap, 1)
51+
// assert.Contains(r.Nested.CustomMap, Key{"key"})
52+
// }},
53+
// {"/nested/embedded/value", "embed-val", nil, func(v interface{}) {
54+
// assert.Equal(v, r.Nested.Embedded.Value)
55+
// }},
56+
// {"/nested/yield/value", "yielded value", nil, func(v interface{}) {
57+
// assert.Equal(v, r.Nested.Yield.Value)
58+
// }},
59+
{"/nested/interface/private/value", uint(3), nil, func(v interface{}) {
60+
assert.Equal(v, r.Nested.InterContainer.Value())
4861
}},
4962
}
5063

5164
for i, test := range tests {
52-
fmt.Printf("=== test %d, pointer %s\n", i, test.ptr)
53-
err := jsonpointer.Assign(test.ptr, &r, test.value)
65+
fmt.Printf("=== RUN TestAssign#%d, pointer %s\n", i+1, test.ptr)
66+
err := jsonpointer.Assign(&r, test.ptr, test.value)
5467
if test.err != nil {
5568
assert.ErrorIs(err, test.err)
5669
} else {
5770
assert.NoError(err)
5871
test.run(test.value)
5972
}
60-
fmt.Println("\tPASS")
73+
fmt.Printf("--- PASS TestAssign #%d, pointer %s\n", i, test.ptr)
6174
}
6275
}

errors.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ var (
5959
//
6060
ErrNilInterface = errors.New("jsonpointer: can not assign due to nil interface")
6161

62-
// ErrMalformedIndex indicates a syntax error in the index or a slice or an
63-
// array.
62+
// ErrMalformedIndex indicates a syntax error in the index or a slice or an array.
6463
ErrMalformedIndex = errors.New("jsonpointer: malformed slice/array index")
6564
)
6665

@@ -102,9 +101,9 @@ type ptrError struct {
102101
func (e *ptrError) Error() string {
103102
t, ok := e.Token()
104103
if ok {
105-
return fmt.Sprintf(`"%v for token "%s" in reference "%v"`, e.err.Error(), t, e.ptr)
104+
return fmt.Sprintf(`%v for token "%s" in reference "%v"`, e.err.Error(), t, e.ptr)
106105
}
107-
return fmt.Sprintf(`"%v" for reference "%v"`, e.err.Error(), e.ptr)
106+
return fmt.Sprintf(`%v for reference "%v"`, e.err.Error(), e.ptr)
108107
}
109108

110109
// Unwrap returns the underlying error.

resolve_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func TestResolveField(t *testing.T) {
5555
}
5656

5757
for i, test := range tests {
58-
fmt.Printf("=== test %d, pointer %s", i, test.ptr)
58+
fmt.Printf("=== RUN TestResolveField #%d, pointer %s\n", i, test.ptr)
5959
var val interface{}
6060
err := jsonpointer.Resolve(r, test.ptr, &val)
6161
if test.expectederr != nil {
@@ -64,7 +64,7 @@ func TestResolveField(t *testing.T) {
6464
assert.NoError(err)
6565
}
6666
assert.Equal(test.expectedval, val)
67-
fmt.Printf("\n\tPASS\n")
67+
fmt.Printf("---PASS\n")
6868
}
6969
}
7070

0 commit comments

Comments
 (0)