Skip to content

Commit b52d9d4

Browse files
authored
Add pointer support to BindFields
This adds support for pointers to BindFields.
1 parent 609745a commit b52d9d4

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

util.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,33 @@ const TAG = "json"
1515
// }
1616
// it will throw panic stack-overflow
1717
func BindFields(obj interface{}) Fields {
18+
t := reflect.TypeOf(obj)
1819
v := reflect.ValueOf(obj)
1920
fields := make(map[string]*Field)
2021

21-
for i := 0; i < v.NumField(); i++ {
22-
typeField := v.Type().Field(i)
22+
if t.Kind() == reflect.Ptr {
23+
t = t.Elem()
24+
v = v.Elem()
25+
}
26+
27+
for i := 0; i < t.NumField(); i++ {
28+
field := t.Field(i)
2329

24-
tag := extractTag(typeField.Tag)
30+
tag := extractTag(field.Tag)
2531
if tag == "-" {
2632
continue
2733
}
2834

29-
var graphType Output
30-
if typeField.Type.Kind() == reflect.Struct {
35+
fieldType := field.Type
3136

37+
if fieldType.Kind() == reflect.Ptr {
38+
fieldType = fieldType.Elem()
39+
}
40+
41+
var graphType Output
42+
if fieldType.Kind() == reflect.Struct {
3243
structFields := BindFields(v.Field(i).Interface())
44+
3345
if tag == "" {
3446
fields = appendFields(fields, structFields)
3547
continue
@@ -46,7 +58,7 @@ func BindFields(obj interface{}) Fields {
4658
}
4759

4860
if graphType == nil {
49-
graphType = getGraphType(typeField.Type)
61+
graphType = getGraphType(fieldType)
5062
}
5163
fields[tag] = &Field{
5264
Type: graphType,
@@ -122,19 +134,19 @@ func appendFields(dest, origin Fields) Fields {
122134
}
123135

124136
func extractValue(originTag string, obj interface{}) interface{} {
125-
val := reflect.ValueOf(obj)
137+
val := reflect.Indirect(reflect.ValueOf(obj))
126138

127139
for j := 0; j < val.NumField(); j++ {
128-
typeField := val.Type().Field(j)
129-
if typeField.Type.Kind() == reflect.Struct {
140+
field := val.Type().Field(j)
141+
if field.Type.Kind() == reflect.Struct {
130142
res := extractValue(originTag, val.Field(j).Interface())
131143
if res != nil {
132144
return res
133145
}
134146
}
135147

136-
if originTag == extractTag(typeField.Tag) {
137-
return val.Field(j).Interface()
148+
if originTag == extractTag(field.Tag) {
149+
return reflect.Indirect(val.Field(j)).Interface()
138150
}
139151
}
140152
return nil
@@ -150,15 +162,15 @@ func extractTag(tag reflect.StructTag) string {
150162

151163
// lazy way of binding args
152164
func BindArg(obj interface{}, tags ...string) FieldConfigArgument {
153-
v := reflect.ValueOf(obj)
165+
v := reflect.Indirect(reflect.ValueOf(obj))
154166
var config = make(FieldConfigArgument)
155167
for i := 0; i < v.NumField(); i++ {
156-
typeField := v.Type().Field(i)
168+
field := v.Type().Field(i)
157169

158-
mytag := extractTag(typeField.Tag)
170+
mytag := extractTag(field.Tag)
159171
if inArray(tags, mytag) {
160172
config[mytag] = &ArgumentConfig{
161-
Type: getGraphType(typeField.Type),
173+
Type: getGraphType(field.Type),
162174
}
163175
}
164176
}

0 commit comments

Comments
 (0)