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}