Skip to content

Commit cf3eb5b

Browse files
committed
allows more types with the Pointable interface
Signed-off-by: Gord Allott <gord@axiom.co>
1 parent ed12351 commit cf3eb5b

File tree

2 files changed

+54
-30
lines changed

2 files changed

+54
-30
lines changed

pointer.go

+30-30
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,16 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam
114114
rValue := reflect.Indirect(reflect.ValueOf(node))
115115
kind := rValue.Kind()
116116

117-
switch kind {
117+
if rValue.Type().Implements(jsonPointableType) {
118+
r, err := node.(JSONPointable).JSONLookup(decodedToken)
119+
if err != nil {
120+
return nil, kind, err
121+
}
122+
return r, kind, nil
123+
}
118124

125+
switch kind {
119126
case reflect.Struct:
120-
if rValue.Type().Implements(jsonPointableType) {
121-
r, err := node.(JSONPointable).JSONLookup(decodedToken)
122-
if err != nil {
123-
return nil, kind, err
124-
}
125-
return r, kind, nil
126-
}
127127
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
128128
if !ok {
129129
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
@@ -161,17 +161,17 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam
161161

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

166-
case reflect.Struct:
167-
if ns, ok := node.(JSONSetable); ok { // pointer impl
168-
return ns.JSONSet(decodedToken, data)
169-
}
165+
if ns, ok := node.(JSONSetable); ok { // pointer impl
166+
return ns.JSONSet(decodedToken, data)
167+
}
170168

171-
if rValue.Type().Implements(jsonSetableType) {
172-
return node.(JSONSetable).JSONSet(decodedToken, data)
173-
}
169+
if rValue.Type().Implements(jsonSetableType) {
170+
return node.(JSONSetable).JSONSet(decodedToken, data)
171+
}
174172

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

273-
switch kind {
274-
275-
case reflect.Struct:
276-
if rValue.Type().Implements(jsonPointableType) {
277-
r, err := node.(JSONPointable).JSONLookup(decodedToken)
278-
if err != nil {
279-
return err
280-
}
281-
fld := reflect.ValueOf(r)
282-
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
283-
node = fld.Addr().Interface()
284-
continue
285-
}
286-
node = r
273+
if rValue.Type().Implements(jsonPointableType) {
274+
r, err := node.(JSONPointable).JSONLookup(decodedToken)
275+
if err != nil {
276+
return err
277+
}
278+
fld := reflect.ValueOf(r)
279+
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
280+
node = fld.Addr().Interface()
287281
continue
288282
}
283+
node = r
284+
continue
285+
}
286+
287+
switch kind {
288+
case reflect.Struct:
289289
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
290290
if !ok {
291291
return fmt.Errorf("object has no field %q", decodedToken)

pointer_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,21 @@ func (p pointableImpl) JSONLookup(token string) (interface{}, error) {
167167
return nil, fmt.Errorf("object has no field %q", token)
168168
}
169169

170+
type pointableMap map[string]string
171+
172+
func (p pointableMap) JSONLookup(token string) (interface{}, error) {
173+
if token == "swap" {
174+
return p["swapped"], nil
175+
}
176+
177+
v, ok := p[token]
178+
if ok {
179+
return v, nil
180+
}
181+
182+
return nil, fmt.Errorf("object has no key %q", token)
183+
}
184+
170185
func TestPointableInterface(t *testing.T) {
171186
p := &pointableImpl{"hello"}
172187

@@ -177,6 +192,15 @@ func TestPointableInterface(t *testing.T) {
177192
result, _, err = GetForToken(p, "something")
178193
assert.Error(t, err)
179194
assert.Nil(t, result)
195+
196+
pm := pointableMap{"swapped": "hello", "a": "world"}
197+
result, _, err = GetForToken(pm, "swap")
198+
assert.NoError(t, err)
199+
assert.Equal(t, pm["swapped"], result)
200+
201+
result, _, err = GetForToken(pm, "a")
202+
assert.NoError(t, err)
203+
assert.Equal(t, pm["a"], result)
180204
}
181205

182206
func TestGetNode(t *testing.T) {

0 commit comments

Comments
 (0)