From 7cef655241c9da014f9577b9971f4c0d40684c78 Mon Sep 17 00:00:00 2001 From: Oleksandr Redko Date: Thu, 13 Jul 2023 15:42:10 +0300 Subject: [PATCH] Optimize hasGraphQLName and isGraphQLFragment --- internal/jsonutil/graphql.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/internal/jsonutil/graphql.go b/internal/jsonutil/graphql.go index b99a9e7..88571c6 100644 --- a/internal/jsonutil/graphql.go +++ b/internal/jsonutil/graphql.go @@ -179,7 +179,7 @@ func (d *decoder) decode() error { continue } for i := 0; i < v.NumField(); i++ { - if isGraphQLFragment(v.Type().Field(i)) || v.Type().Field(i).Anonymous { + if isGraphQLFragment(v.Type().Field(i).Tag) || v.Type().Field(i).Anonymous { // Add GraphQL fragment or embedded struct. d.vs = append(d.vs, []reflect.Value{v.Field(i)}) frontier = append(frontier, v.Field(i)) @@ -256,11 +256,12 @@ func (d *decoder) popAllVs() { // that matches GraphQL name, or invalid reflect.Value if none found. func fieldByGraphQLName(v reflect.Value, name string) reflect.Value { for i := 0; i < v.NumField(); i++ { - if v.Type().Field(i).PkgPath != "" { + f := v.Type().Field(i) + if f.PkgPath != "" { // Skip unexported field. continue } - if hasGraphQLName(v.Type().Field(i), name) { + if hasGraphQLName(f.Name, f.Tag, name) { return v.Field(i) } } @@ -268,12 +269,10 @@ func fieldByGraphQLName(v reflect.Value, name string) reflect.Value { } // hasGraphQLName reports whether struct field f has GraphQL name. -func hasGraphQLName(f reflect.StructField, name string) bool { - value, ok := f.Tag.Lookup("graphql") +func hasGraphQLName(fname string, ftag reflect.StructTag, name string) bool { + value, ok := ftag.Lookup("graphql") if !ok { - // TODO: caseconv package is relatively slow. Optimize it, then consider using it here. - //return caseconv.MixedCapsToLowerCamelCase(f.Name) == name - return strings.EqualFold(f.Name, name) + return strings.EqualFold(fname, name) } value = strings.TrimSpace(value) // TODO: Parse better. if strings.HasPrefix(value, "...") { @@ -289,8 +288,8 @@ func hasGraphQLName(f reflect.StructField, name string) bool { } // isGraphQLFragment reports whether struct field f is a GraphQL fragment. -func isGraphQLFragment(f reflect.StructField) bool { - value, ok := f.Tag.Lookup("graphql") +func isGraphQLFragment(ftag reflect.StructTag) bool { + value, ok := ftag.Lookup("graphql") if !ok { return false }