schemaconfig.go

 1package schemaconfig
 2
 3import (
 4	"github.com/99designs/gqlgen/codegen/config"
 5	"github.com/99designs/gqlgen/plugin"
 6	"github.com/vektah/gqlparser/ast"
 7)
 8
 9func New() plugin.Plugin {
10	return &Plugin{}
11}
12
13type Plugin struct{}
14
15var _ plugin.ConfigMutator = &Plugin{}
16
17func (m *Plugin) Name() string {
18	return "schemaconfig"
19}
20
21func (m *Plugin) MutateConfig(cfg *config.Config) error {
22	if err := cfg.Check(); err != nil {
23		return err
24	}
25
26	schema, _, err := cfg.LoadSchema()
27	if err != nil {
28		return err
29	}
30
31	cfg.Directives["goModel"] = config.DirectiveConfig{
32		SkipRuntime: true,
33	}
34
35	cfg.Directives["goField"] = config.DirectiveConfig{
36		SkipRuntime: true,
37	}
38
39	for _, schemaType := range schema.Types {
40		if schemaType == schema.Query || schemaType == schema.Mutation || schemaType == schema.Subscription {
41			continue
42		}
43
44		if bd := schemaType.Directives.ForName("goModel"); bd != nil {
45			if ma := bd.Arguments.ForName("model"); ma != nil {
46				if mv, err := ma.Value.Value(nil); err == nil {
47					cfg.Models.Add(schemaType.Name, mv.(string))
48				}
49			}
50			if ma := bd.Arguments.ForName("models"); ma != nil {
51				if mvs, err := ma.Value.Value(nil); err == nil {
52					for _, mv := range mvs.([]interface{}) {
53						cfg.Models.Add(schemaType.Name, mv.(string))
54					}
55				}
56			}
57		}
58
59		if schemaType.Kind == ast.Object || schemaType.Kind == ast.InputObject {
60			for _, field := range schemaType.Fields {
61				if fd := field.Directives.ForName("goField"); fd != nil {
62					forceResolver := cfg.Models[schemaType.Name].Fields[field.Name].Resolver
63					fieldName := cfg.Models[schemaType.Name].Fields[field.Name].FieldName
64
65					if ra := fd.Arguments.ForName("forceResolver"); ra != nil {
66						if fr, err := ra.Value.Value(nil); err == nil {
67							forceResolver = fr.(bool)
68						}
69					}
70
71					if na := fd.Arguments.ForName("name"); na != nil {
72						if fr, err := na.Value.Value(nil); err == nil {
73							fieldName = fr.(string)
74						}
75					}
76
77					if cfg.Models[schemaType.Name].Fields == nil {
78						cfg.Models[schemaType.Name] = config.TypeMapEntry{
79							Model:  cfg.Models[schemaType.Name].Model,
80							Fields: map[string]config.TypeMapField{},
81						}
82					}
83
84					cfg.Models[schemaType.Name].Fields[field.Name] = config.TypeMapField{
85						FieldName: fieldName,
86						Resolver:  forceResolver,
87					}
88				}
89			}
90		}
91	}
92	return nil
93}