Skip to content

Commit

Permalink
allows more types with the Pointable interface
Browse files Browse the repository at this point in the history
Signed-off-by: Gord Allott <[email protected]>
  • Loading branch information
gordallott committed Sep 3, 2020
1 parent ed12351 commit cf3eb5b
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 30 deletions.
60 changes: 30 additions & 30 deletions pointer.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,16 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()

switch kind {
if rValue.Type().Implements(jsonPointableType) {
r, err := node.(JSONPointable).JSONLookup(decodedToken)
if err != nil {
return nil, kind, err
}
return r, kind, nil
}

switch kind {
case reflect.Struct:
if rValue.Type().Implements(jsonPointableType) {
r, err := node.(JSONPointable).JSONLookup(decodedToken)
if err != nil {
return nil, kind, err
}
return r, kind, nil
}
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
Expand Down Expand Up @@ -161,17 +161,17 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam

func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error {
rValue := reflect.Indirect(reflect.ValueOf(node))
switch rValue.Kind() {

case reflect.Struct:
if ns, ok := node.(JSONSetable); ok { // pointer impl
return ns.JSONSet(decodedToken, data)
}
if ns, ok := node.(JSONSetable); ok { // pointer impl
return ns.JSONSet(decodedToken, data)
}

if rValue.Type().Implements(jsonSetableType) {
return node.(JSONSetable).JSONSet(decodedToken, data)
}
if rValue.Type().Implements(jsonSetableType) {
return node.(JSONSetable).JSONSet(decodedToken, data)
}

switch rValue.Kind() {
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
return fmt.Errorf("object has no field %q", decodedToken)
Expand Down Expand Up @@ -270,22 +270,22 @@ func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) e
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()

switch kind {

case reflect.Struct:
if rValue.Type().Implements(jsonPointableType) {
r, err := node.(JSONPointable).JSONLookup(decodedToken)
if err != nil {
return err
}
fld := reflect.ValueOf(r)
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
node = fld.Addr().Interface()
continue
}
node = r
if rValue.Type().Implements(jsonPointableType) {
r, err := node.(JSONPointable).JSONLookup(decodedToken)
if err != nil {
return err
}
fld := reflect.ValueOf(r)
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
node = fld.Addr().Interface()
continue
}
node = r
continue
}

switch kind {
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
return fmt.Errorf("object has no field %q", decodedToken)
Expand Down
24 changes: 24 additions & 0 deletions pointer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,21 @@ func (p pointableImpl) JSONLookup(token string) (interface{}, error) {
return nil, fmt.Errorf("object has no field %q", token)
}

type pointableMap map[string]string

func (p pointableMap) JSONLookup(token string) (interface{}, error) {
if token == "swap" {
return p["swapped"], nil
}

v, ok := p[token]
if ok {
return v, nil
}

return nil, fmt.Errorf("object has no key %q", token)
}

func TestPointableInterface(t *testing.T) {
p := &pointableImpl{"hello"}

Expand All @@ -177,6 +192,15 @@ func TestPointableInterface(t *testing.T) {
result, _, err = GetForToken(p, "something")
assert.Error(t, err)
assert.Nil(t, result)

pm := pointableMap{"swapped": "hello", "a": "world"}
result, _, err = GetForToken(pm, "swap")
assert.NoError(t, err)
assert.Equal(t, pm["swapped"], result)

result, _, err = GetForToken(pm, "a")
assert.NoError(t, err)
assert.Equal(t, pm["a"], result)
}

func TestGetNode(t *testing.T) {
Expand Down

0 comments on commit cf3eb5b

Please sign in to comment.