Skip to content

Commit

Permalink
Add option to omit resolver fields from models (#2957)
Browse files Browse the repository at this point in the history
  • Loading branch information
Desuuuu committed Mar 7, 2024
1 parent 95f9dc7 commit bc72cd8
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 4 deletions.
1 change: 1 addition & 0 deletions codegen/config/config.go
Expand Up @@ -39,6 +39,7 @@ type Config struct {
OmitGQLGenFileNotice bool `yaml:"omit_gqlgen_file_notice,omitempty"`
OmitGQLGenVersionInFileNotice bool `yaml:"omit_gqlgen_version_in_file_notice,omitempty"`
OmitRootModels bool `yaml:"omit_root_models,omitempty"`
OmitResolverFields bool `yaml:"omit_resolver_fields,omitempty"`
StructFieldsAlwaysPointers bool `yaml:"struct_fields_always_pointers,omitempty"`
ReturnPointersInUmarshalInput bool `yaml:"return_pointers_in_unmarshalinput,omitempty"`
ResolversAlwaysReturnPointers bool `yaml:"resolvers_always_return_pointers,omitempty"`
Expand Down
3 changes: 3 additions & 0 deletions docs/content/config.md
Expand Up @@ -65,6 +65,9 @@ resolver:
# Optional: turn on to exclude root models such as Query and Mutation from the generated models file.
# omit_root_models: false

# Optional: turn on to exclude resolver fields from the generated models file.
# omit_resolver_fields: false

# Optional: turn off to make struct-type struct fields not use pointers
# e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing }
# struct_fields_always_pointers: true
Expand Down
19 changes: 15 additions & 4 deletions plugin/modelgen/models.go
Expand Up @@ -68,10 +68,11 @@ type Field struct {
// Name is the field's name as it appears in the schema
Name string
// GoName is the field's name as it appears in the generated Go code
GoName string
Type types.Type
Tag string
Omittable bool
GoName string
Type types.Type
Tag string
IsResolver bool
Omittable bool
}

type Enum struct {
Expand Down Expand Up @@ -419,6 +420,10 @@ func (m *Plugin) generateFields(cfg *config.Config, schemaType *ast.Definition)
f = mf
}

if f.IsResolver && cfg.OmitResolverFields {
continue
}

if f.Omittable {
if schemaType.Kind != ast.InputObject || field.Type.NonNull {
return nil, fmt.Errorf("generror: field %v.%v: omittable is only applicable to nullable input fields", schemaType.Name, field.Name)
Expand Down Expand Up @@ -613,6 +618,12 @@ func GoFieldHook(td *ast.Definition, fd *ast.FieldDefinition, f *Field) (*Field,
}
}

if arg := goField.Arguments.ForName("forceResolver"); arg != nil {
if k, err := arg.Value.Value(nil); err == nil {
f.IsResolver = k.(bool)
}
}

if arg := goField.Arguments.ForName("omittable"); arg != nil {
if k, err := arg.Value.Value(nil); err == nil {
f.Omittable = k.(bool)
Expand Down
17 changes: 17 additions & 0 deletions plugin/modelgen/models_test.go
Expand Up @@ -315,6 +315,23 @@ func TestModelGenerationOmitRootModels(t *testing.T) {
require.NotContains(t, string(generated), "type Subscription struct")
}

func TestModelGenerationOmitResolverFields(t *testing.T) {
cfg, err := config.LoadConfig("testdata/gqlgen_omit_resolver_fields.yml")
require.NoError(t, err)
require.NoError(t, cfg.Init())
p := Plugin{
MutateHook: mutateHook,
FieldHook: DefaultFieldMutateHook,
}
require.NoError(t, p.MutateConfig(cfg))
require.NoError(t, goBuild(t, "./out_omit_resolver_fields/"))
generated, err := os.ReadFile("./out_omit_resolver_fields/generated.go")
require.NoError(t, err)
require.Contains(t, string(generated), "type Base struct")
require.Contains(t, string(generated), "StandardField")
require.NotContains(t, string(generated), "ResolverField")
}

func TestModelGenerationStructFieldPointers(t *testing.T) {
cfg, err := config.LoadConfig("testdata/gqlgen_struct_field_pointers.yml")
require.NoError(t, err)
Expand Down
10 changes: 10 additions & 0 deletions plugin/modelgen/out_omit_resolver_fields/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions plugin/modelgen/testdata/gqlgen_omit_resolver_fields.yml
@@ -0,0 +1,9 @@
schema:
- "testdata/schema_omit_resolver_fields.graphql"

exec:
filename: out_omit_resolver_fields/ignored.go
model:
filename: out_omit_resolver_fields/generated.go

omit_resolver_fields: true
15 changes: 15 additions & 0 deletions plugin/modelgen/testdata/schema_omit_resolver_fields.graphql
@@ -0,0 +1,15 @@
directive @goTag(
key: String!
value: String
) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION

directive @goField(
forceResolver: Boolean
name: String
omittable: Boolean
) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION | INTERFACE

type Base {
StandardField: String!
ResolverField: String! @goField(forceResolver: true)
}

0 comments on commit bc72cd8

Please sign in to comment.