Skip to content

Commit

Permalink
improve convert map performance
Browse files Browse the repository at this point in the history
  • Loading branch information
adelsz committed Oct 25, 2023
1 parent 6b3c61f commit 732b137
Showing 1 changed file with 56 additions and 8 deletions.
64 changes: 56 additions & 8 deletions language/visitor/visitor.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package visitor

import (
"encoding/json"
"reflect"

"fmt"
"github.com/graphql-go/graphql/language/ast"
"github.com/graphql-go/graphql/language/typeInfo"
"reflect"
)

const (
Expand Down Expand Up @@ -446,14 +445,63 @@ func convertMap(src interface{}) (dest map[string]interface{}, err error) {
if src == nil {
return
}
var bts []byte
if bts, err = json.Marshal(src); err != nil {

// return if src is already a map
dest, ok := src.(map[string]interface{})
if ok {
return
}
if err = json.Unmarshal(bts, &dest); err != nil {
return

outputMap := make(map[string]interface{})
val := reflect.ValueOf(src)

// Dereference pointer if necessary
if val.Kind() == reflect.Ptr {
if val.IsNil() {
return nil, fmt.Errorf("input is a nil pointer")
}
val = val.Elem()
}

if val.Kind() != reflect.Struct {
return nil, fmt.Errorf("input is not a struct or pointer to struct")
}
return

typ := val.Type()
for i := 0; i < val.NumField(); i++ {
field := val.Field(i)
fieldName := typ.Field(i).Name

switch field.Kind() {
case reflect.Ptr:
if field.IsNil() {
outputMap[fieldName] = nil
} else {
nestedMap, err := convertMap(field.Interface())
if err != nil {
return nil, err
}
outputMap[fieldName] = nestedMap
}
case reflect.Struct:
nestedMap, err := convertMap(field.Interface())
if err != nil {
return nil, err
}
outputMap[fieldName] = nestedMap
case reflect.Interface:
if field.IsNil() {
outputMap[fieldName] = nil
} else {
concreteValue := field.Elem()
outputMap[fieldName], _ = convertMap(concreteValue.Interface())
}
default:
outputMap[fieldName] = field.Interface()
}
}

return outputMap, nil
}

// get value by key from struct | slice | map | wrap(prev)
Expand Down

0 comments on commit 732b137

Please sign in to comment.