Skip to content

Commit dd41378

Browse files
committed
...
1 parent 879aed3 commit dd41378

File tree

3 files changed

+78
-63
lines changed

3 files changed

+78
-63
lines changed

assign_test.go

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,45 +19,45 @@ func TestAssign(t *testing.T) {
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])
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-
// }},
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+
}},
5959
{"/nested/interface/private/value", uint(3), nil, func(v interface{}) {
60-
assert.Equal(v, r.Nested.InterContainer.Value())
60+
assert.Equal(v, r.Nested.InterContainer.Interface.Value())
6161
}},
6262
}
6363

state.go

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"reflect"
1010
"strconv"
1111
"sync"
12-
13-
"github.com/sanity-io/litter"
1412
)
1513

1614
var (
@@ -332,27 +330,30 @@ func (s *state) assign(dst reflect.Value, value reflect.Value) (reflect.Value, e
332330
var nv reflect.Value
333331
nv, err = s.assign(nd, value)
334332
s.current = s.current.Prepend(t)
335-
336333
if err != nil {
337334
return dst, err
338335
}
339-
340-
fmt.Println("nd.Type", nd.Type())
341-
fmt.Println("nv.Type", nv.Type())
342-
fmt.Println("nv.Elem.Type", nv.Elem().Type())
343-
fmt.Println("nv.Elem.IsNil", nv.IsNil())
344-
fmt.Println("dst.Type", dst.Type())
345336
if dst.Type().NumMethod() > 0 && dst.CanInterface() && dst.Type().Implements(typeAssigner) {
346337
if assigner, ok := dst.Interface().(Assigner); ok {
347-
fmt.Println("dst.Elem().Type()", dst.Elem().Type())
348-
fmt.Println("dst.Type()", dst.Type())
349-
fmt.Println("dst", litter.Sdump(dst.Interface()))
350338
nve := nv.Elem().Interface()
351-
fmt.Println("nve:", litter.Sdump(nve))
352-
fmt.Println("assigner", assigner)
353-
if assigner == nil {
354-
fmt.Println("wtf is assigner nil for?")
339+
err = assigner.AssignByJSONPointer(&cur, nve)
340+
if err != nil {
341+
if !errors.Is(err, YieldOperation) {
342+
return dst, newError(err, *s, dst.Elem().Type())
343+
} else {
344+
// the Assigner has yielded operation back to jsonpointer
345+
// resetting current incase the Assigner mutated it
346+
cur = s.current
347+
}
348+
} else {
349+
return dst, nil
355350
}
351+
// updating state to reflect the new token if it was set by assigner
352+
s.current = cur
353+
}
354+
} else if dst.Elem().Type().NumMethod() > 0 && dst.Elem().CanInterface() && dst.Type().Elem().Implements(typeAssigner) {
355+
if assigner, ok := dst.Elem().Interface().(Assigner); ok {
356+
nve := nv.Elem().Interface()
356357
err = assigner.AssignByJSONPointer(&cur, nve)
357358
if err != nil {
358359
if !errors.Is(err, YieldOperation) {
@@ -369,7 +370,6 @@ func (s *state) assign(dst reflect.Value, value reflect.Value) (reflect.Value, e
369370
s.current = cur
370371
}
371372
}
372-
373373
nd, err = s.assignValue(nd, nv.Elem())
374374
if err != nil {
375375
return nd, err
@@ -395,10 +395,7 @@ func (s *state) assignValue(dst reflect.Value, v reflect.Value) (reflect.Value,
395395
return dst, nil
396396
}
397397
// TODO: replace with an error
398-
fmt.Println("dst type:", dst.Type())
399-
fmt.Println("val type:", v.Type())
400-
fmt.Println("val kind:", v.Kind())
401-
panic("can not assign")
398+
return v, newValueError(ErrNotAssignable, *s, dst.Elem().Type(), v.Type())
402399
}
403400

404401
func (s *state) delete(src reflect.Value) error {

types_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package jsonpointer_test
22

33
import (
44
"fmt"
5+
"reflect"
56

67
"github.com/chanced/jsonpointer"
8+
"github.com/sanity-io/litter"
79
)
810

911
type Root struct {
@@ -44,7 +46,20 @@ type Nested struct {
4446
}
4547

4648
type InterContainer struct {
47-
Interface `json:",inline"`
49+
Interface Interface `json:",inline"`
50+
}
51+
52+
func (ic *InterContainer) AssignByJSONPointer(ptr *jsonpointer.JSONPointer, v interface{}) error {
53+
fmt.Println("=======================")
54+
litter.Config.Dump(v)
55+
fmt.Println("=======================")
56+
switch typ := v.(type) {
57+
case Interface:
58+
ic.Interface = typ
59+
return nil
60+
default:
61+
panic("unexpected type: " + reflect.TypeOf(v).String())
62+
}
4863
}
4964

5065
func (ic InterContainer) ResolveJSONPointer(ptr *jsonpointer.JSONPointer, op jsonpointer.Operation) (interface{}, error) {
@@ -57,18 +72,21 @@ func (ic InterContainer) ResolveJSONPointer(ptr *jsonpointer.JSONPointer, op jso
5772
case "private":
5873
if in, ok := ic.Interface.(*privateImpl); ok {
5974
*ptr = p
75+
fmt.Println("---> InterContainer returning ", in)
6076
return in, nil
6177
}
62-
if op == jsonpointer.Assigning {
78+
if op.IsAssigning() {
6379
*ptr = p
64-
return &privateImpl{private: &struct{ value uint }{}}, nil
80+
x := &privateImpl{private: &struct{ value uint }{value: 5}}
81+
fmt.Println("---> InterContainer returning ", litter.Sdump(x))
82+
return x, nil
6583
}
6684
case "public":
6785
if in, ok := ic.Interface.(*PublicImpl); ok {
6886
*ptr = p
6987
return in, nil
7088
}
71-
if op == jsonpointer.Assigning {
89+
if op.IsAssigning() {
7290
*ptr = p
7391
return &PublicImpl{}, nil
7492
}

0 commit comments

Comments
 (0)