diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 239de388..bb73a750 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -22,12 +22,19 @@ When releasing a new version: ### Breaking changes: +- omitempty validation: + - forbid `omitempty: false` (including implicit behaviour) when using pointer on non-null, no-default input field + ### New features: - genqlient now supports double-star globs for schema and query files; see [`genqlient.yaml` docs](genqlient.yaml) for more. ### Bug fixes: +- omitempty validation: + - allow `omitempty` on non-nullable input field, if the field has a default + - allow `omitempty: false` on an input field, even when it is non-nullable + ## v0.7.0 In addition to several new features and bugfixes, along with this release comes reorganized [documentation](.) for genqlient. Note that genqlient now requires Go 1.20 or higher, and is tested through Go 1.22. diff --git a/generate/convert.go b/generate/convert.go index 3e3dc03f..b61f227b 100644 --- a/generate/convert.go +++ b/generate/convert.go @@ -450,6 +450,19 @@ func (g *generator) convertDefinition( return nil, err } + // Try to protect against generating field type that has possibility to send `null` to non-nullable graphQL + // type. This does not protect against lists/slices, as Go zero-slices are already serialized as `null` + // (which can therefore currently send invalid graphQL value - e.g. `null` for [String!]!) + // And does not protect against custom MarshalJSON. + _, isPointer := fieldGoType.(*goPointerType) + if field.Type.NonNull && isPointer && !fieldOptions.GetOmitempty() { + return nil, errorf(pos, "pointer on non-null input field can only be used together with omitempty: %s.%s", name, field.Name) + } + + if fieldOptions.GetOmitempty() && field.Type.NonNull && field.DefaultValue == nil { + return nil, errorf(pos, "omitempty may only be used on optional arguments: %s.%s", name, field.Name) + } + goType.Fields[i] = &goStructField{ GoName: goName, GoType: fieldGoType, diff --git a/generate/genqlient_directive.go b/generate/genqlient_directive.go index ba5119e8..f6adfdab 100644 --- a/generate/genqlient_directive.go +++ b/generate/genqlient_directive.go @@ -213,10 +213,6 @@ func (dir *genqlientDirective) validate(node interface{}, schema *ast.Schema) er return errorf(fieldDir.pos, "struct and flatten can't be used via for") } - if fieldDir.Omitempty != nil && field.Type.NonNull { - return errorf(fieldDir.pos, "omitempty may only be used on optional arguments") - } - if fieldDir.TypeName != "" && fieldDir.Bind != "" && fieldDir.Bind != "-" { return errorf(fieldDir.pos, "typename and bind may not be used together") } diff --git a/generate/testdata/errors/DefaultInputsNoOmitPointer.graphql b/generate/testdata/errors/DefaultInputsNoOmitPointer.graphql new file mode 100644 index 00000000..7260705f --- /dev/null +++ b/generate/testdata/errors/DefaultInputsNoOmitPointer.graphql @@ -0,0 +1,7 @@ +# very similar to DefaultInputsNoOmitPointerForDirective.graphql - same expected behaviour, but takes a different code path(?) +# @genqlient(pointer: true) +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/errors/DefaultInputsNoOmitPointerForDirective.graphql b/generate/testdata/errors/DefaultInputsNoOmitPointerForDirective.graphql new file mode 100644 index 00000000..58ba83a1 --- /dev/null +++ b/generate/testdata/errors/DefaultInputsNoOmitPointerForDirective.graphql @@ -0,0 +1,8 @@ +# Non-nullable input field with default cannot be pointer without omitempty - as that +# would send `null`, which is invalid value. +# @genqlient(for: "InputWithDefaults.field", pointer: true) +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/errors/OmitemptyDirective.graphql b/generate/testdata/errors/OmitemptyDirective.graphql new file mode 100644 index 00000000..ce9cac94 --- /dev/null +++ b/generate/testdata/errors/OmitemptyDirective.graphql @@ -0,0 +1,7 @@ +# One of the input filed is non-nullable -> cannot omit it +# @genqlient(omitempty: true) +query OmitemptyDirective ( + $input: OmitemptyInput +) { + omitempty(input: $input) +} diff --git a/generate/testdata/errors/OmitemptyForDirective.graphql b/generate/testdata/errors/OmitemptyForDirective.graphql new file mode 100644 index 00000000..3d247f4c --- /dev/null +++ b/generate/testdata/errors/OmitemptyForDirective.graphql @@ -0,0 +1,7 @@ +# The specific input field is non-nullable -> cannot omit it +# @genqlient(for: "OmitemptyInput.field", omitempty: true) +query OmitemptyDirective ( + $input: OmitemptyInput +) { + omitempty(input: $input) +} diff --git a/generate/testdata/errors/schema.graphql b/generate/testdata/errors/schema.graphql index 95219767..dacfda44 100644 --- a/generate/testdata/errors/schema.graphql +++ b/generate/testdata/errors/schema.graphql @@ -1,6 +1,10 @@ type Query { f: String user: User + # The top-level default is currently not used - there is no query that would not specify the input argument. + # But it is here for completeness - maybe it will be used in future or cause some other unexpected issues. + default(input: InputWithDefaults! = {field: "input omitted"}): Boolean + omitempty(input: OmitemptyInput): Boolean } type User { @@ -9,3 +13,13 @@ type User { } scalar ValidScalar + +input InputWithDefaults { + field: String! = "input field omitted" + nullableField: String = "nullable input field omitted" +} + +input OmitemptyInput { + field: String! + nullableField: String +} diff --git a/generate/testdata/queries/DefaultInputs.graphql b/generate/testdata/queries/DefaultInputs.graphql new file mode 100644 index 00000000..3a22b51e --- /dev/null +++ b/generate/testdata/queries/DefaultInputs.graphql @@ -0,0 +1,7 @@ +# Without any extra directives or configuration, the defaults are never considered, +# as the client sends at least zero-value (struct with empty string). +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/queries/DefaultInputsPointer.graphql b/generate/testdata/queries/DefaultInputsPointer.graphql new file mode 100644 index 00000000..a6604c20 --- /dev/null +++ b/generate/testdata/queries/DefaultInputsPointer.graphql @@ -0,0 +1,9 @@ +# The `InputWithDefaults.field` cannot be `pointer: true`, together with implicit `omitempty: false`, as `null` is +# not a valid value there. However, nullableField should still be ok +# (this will send null, overwriting the server's default) +# @genqlient(for: "InputWithDefaults.nullableField", pointer: true) +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/queries/DefaultInputsWithDirective.graphql b/generate/testdata/queries/DefaultInputsWithDirective.graphql new file mode 100644 index 00000000..6739976d --- /dev/null +++ b/generate/testdata/queries/DefaultInputsWithDirective.graphql @@ -0,0 +1,7 @@ +# very similar to DefaultInputsWithForDirective.graphql - same expected behaviour, but takes a different code path(?) +# @genqlient(omitempty: true) +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/queries/DefaultInputsWithForDirective.graphql b/generate/testdata/queries/DefaultInputsWithForDirective.graphql new file mode 100644 index 00000000..ad493b98 --- /dev/null +++ b/generate/testdata/queries/DefaultInputsWithForDirective.graphql @@ -0,0 +1,7 @@ +# @genqlient(for: "InputWithDefaults.field", omitempty: true) +# @genqlient(for: "InputWithDefaults.nullableField", omitempty: true) +query DefaultInputs( + $input: InputWithDefaults! +) { + default(input: $input) +} diff --git a/generate/testdata/queries/OmitemptyFalse.graphql b/generate/testdata/queries/OmitemptyFalse.graphql new file mode 100644 index 00000000..506d2129 --- /dev/null +++ b/generate/testdata/queries/OmitemptyFalse.graphql @@ -0,0 +1,7 @@ +# @genqlient(omitempty: true) +# @genqlient(for: "OmitemptyInput.field",omitempty: false) +query OmitemptyFalse( + $input: OmitemptyInput +) { + omitempty(input: $input) +} diff --git a/generate/testdata/queries/schema.graphql b/generate/testdata/queries/schema.graphql index eb71bdd4..52559823 100644 --- a/generate/testdata/queries/schema.graphql +++ b/generate/testdata/queries/schema.graphql @@ -185,6 +185,10 @@ type Query { recur(input: RecursiveInput!): Recursive acceptsListOfListOfListsOfDates(datesss: [[[Date!]!]!]!): Boolean getPokemon(where: getPokemonBoolExp): [Pokemon!]! + # The top-level default is currently not used - there is no query that would not specify the input argument. + # But it is here for completeness - maybe it will be used in future or cause some other unexpected issues. + default(input: InputWithDefaults! = {field: "input omitted"}): Boolean + omitempty(input: OmitemptyInput): Boolean } type Mutation { @@ -212,3 +216,13 @@ input IntComparisonExp { _neq: Int _nin: [Int!] } + +input InputWithDefaults { + field: String! = "input field omitted" + nullableField: String = "nullable input field omitted" +} + +input OmitemptyInput { + field: String! + nullableField: String +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.go b/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.go new file mode 100644 index 00000000..d91bb811 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.go @@ -0,0 +1,68 @@ +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +package test + +import ( + "github.com/Khan/genqlient/graphql" +) + +// DefaultInputsResponse is returned by DefaultInputs on success. +type DefaultInputsResponse struct { + Default bool `json:"default"` +} + +// GetDefault returns DefaultInputsResponse.Default, and is useful for accessing the field via an interface. +func (v *DefaultInputsResponse) GetDefault() bool { return v.Default } + +type InputWithDefaults struct { + Field string `json:"field"` + NullableField string `json:"nullableField"` +} + +// GetField returns InputWithDefaults.Field, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetField() string { return v.Field } + +// GetNullableField returns InputWithDefaults.NullableField, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetNullableField() string { return v.NullableField } + +// __DefaultInputsInput is used internally by genqlient +type __DefaultInputsInput struct { + Input InputWithDefaults `json:"input"` +} + +// GetInput returns __DefaultInputsInput.Input, and is useful for accessing the field via an interface. +func (v *__DefaultInputsInput) GetInput() InputWithDefaults { return v.Input } + +// The query or mutation executed by DefaultInputs. +const DefaultInputs_Operation = ` +query DefaultInputs ($input: InputWithDefaults!) { + default(input: $input) +} +` + +// Without any extra directives or configuration, the defaults are never considered, +// as the client sends at least zero-value (struct with empty string). +func DefaultInputs( + client_ graphql.Client, + input InputWithDefaults, +) (*DefaultInputsResponse, error) { + req_ := &graphql.Request{ + OpName: "DefaultInputs", + Query: DefaultInputs_Operation, + Variables: &__DefaultInputsInput{ + Input: input, + }, + } + var err_ error + + var data_ DefaultInputsResponse + resp_ := &graphql.Response{Data: &data_} + + err_ = client_.MakeRequest( + nil, + req_, + resp_, + ) + + return &data_, err_ +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.json b/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.json new file mode 100644 index 00000000..14090db7 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputs.graphql-DefaultInputs.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "DefaultInputs", + "query": "\nquery DefaultInputs ($input: InputWithDefaults!) {\n\tdefault(input: $input)\n}\n", + "sourceLocation": "testdata/queries/DefaultInputs.graphql" + } + ] +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.go b/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.go new file mode 100644 index 00000000..a7d31221 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.go @@ -0,0 +1,69 @@ +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +package test + +import ( + "github.com/Khan/genqlient/graphql" +) + +// DefaultInputsResponse is returned by DefaultInputs on success. +type DefaultInputsResponse struct { + Default bool `json:"default"` +} + +// GetDefault returns DefaultInputsResponse.Default, and is useful for accessing the field via an interface. +func (v *DefaultInputsResponse) GetDefault() bool { return v.Default } + +type InputWithDefaults struct { + Field string `json:"field"` + NullableField *string `json:"nullableField"` +} + +// GetField returns InputWithDefaults.Field, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetField() string { return v.Field } + +// GetNullableField returns InputWithDefaults.NullableField, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetNullableField() *string { return v.NullableField } + +// __DefaultInputsInput is used internally by genqlient +type __DefaultInputsInput struct { + Input InputWithDefaults `json:"input"` +} + +// GetInput returns __DefaultInputsInput.Input, and is useful for accessing the field via an interface. +func (v *__DefaultInputsInput) GetInput() InputWithDefaults { return v.Input } + +// The query or mutation executed by DefaultInputs. +const DefaultInputs_Operation = ` +query DefaultInputs ($input: InputWithDefaults!) { + default(input: $input) +} +` + +// The `InputWithDefaults.field` cannot be `pointer: true`, together with implicit `omitempty: false`, as `null` is +// not a valid value there. However, nullableField should still be ok +// (this will send null, overwriting the server's default) +func DefaultInputs( + client_ graphql.Client, + input InputWithDefaults, +) (*DefaultInputsResponse, error) { + req_ := &graphql.Request{ + OpName: "DefaultInputs", + Query: DefaultInputs_Operation, + Variables: &__DefaultInputsInput{ + Input: input, + }, + } + var err_ error + + var data_ DefaultInputsResponse + resp_ := &graphql.Response{Data: &data_} + + err_ = client_.MakeRequest( + nil, + req_, + resp_, + ) + + return &data_, err_ +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.json b/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.json new file mode 100644 index 00000000..dd893fb0 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsPointer.graphql-DefaultInputsPointer.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "DefaultInputs", + "query": "\nquery DefaultInputs ($input: InputWithDefaults!) {\n\tdefault(input: $input)\n}\n", + "sourceLocation": "testdata/queries/DefaultInputsPointer.graphql" + } + ] +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.go b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.go new file mode 100644 index 00000000..07903e7f --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.go @@ -0,0 +1,67 @@ +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +package test + +import ( + "github.com/Khan/genqlient/graphql" +) + +// DefaultInputsResponse is returned by DefaultInputs on success. +type DefaultInputsResponse struct { + Default bool `json:"default"` +} + +// GetDefault returns DefaultInputsResponse.Default, and is useful for accessing the field via an interface. +func (v *DefaultInputsResponse) GetDefault() bool { return v.Default } + +type InputWithDefaults struct { + Field string `json:"field,omitempty"` + NullableField string `json:"nullableField,omitempty"` +} + +// GetField returns InputWithDefaults.Field, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetField() string { return v.Field } + +// GetNullableField returns InputWithDefaults.NullableField, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetNullableField() string { return v.NullableField } + +// __DefaultInputsInput is used internally by genqlient +type __DefaultInputsInput struct { + Input InputWithDefaults `json:"input,omitempty"` +} + +// GetInput returns __DefaultInputsInput.Input, and is useful for accessing the field via an interface. +func (v *__DefaultInputsInput) GetInput() InputWithDefaults { return v.Input } + +// The query or mutation executed by DefaultInputs. +const DefaultInputs_Operation = ` +query DefaultInputs ($input: InputWithDefaults!) { + default(input: $input) +} +` + +// very similar to DefaultInputsWithForDirective.graphql - same expected behaviour, but takes a different code path(?) +func DefaultInputs( + client_ graphql.Client, + input InputWithDefaults, +) (*DefaultInputsResponse, error) { + req_ := &graphql.Request{ + OpName: "DefaultInputs", + Query: DefaultInputs_Operation, + Variables: &__DefaultInputsInput{ + Input: input, + }, + } + var err_ error + + var data_ DefaultInputsResponse + resp_ := &graphql.Response{Data: &data_} + + err_ = client_.MakeRequest( + nil, + req_, + resp_, + ) + + return &data_, err_ +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.json b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.json new file mode 100644 index 00000000..8e1334f3 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithDirective.graphql-DefaultInputsWithDirective.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "DefaultInputs", + "query": "\nquery DefaultInputs ($input: InputWithDefaults!) {\n\tdefault(input: $input)\n}\n", + "sourceLocation": "testdata/queries/DefaultInputsWithDirective.graphql" + } + ] +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.go b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.go new file mode 100644 index 00000000..9d1475dd --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.go @@ -0,0 +1,66 @@ +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +package test + +import ( + "github.com/Khan/genqlient/graphql" +) + +// DefaultInputsResponse is returned by DefaultInputs on success. +type DefaultInputsResponse struct { + Default bool `json:"default"` +} + +// GetDefault returns DefaultInputsResponse.Default, and is useful for accessing the field via an interface. +func (v *DefaultInputsResponse) GetDefault() bool { return v.Default } + +type InputWithDefaults struct { + Field string `json:"field,omitempty"` + NullableField string `json:"nullableField,omitempty"` +} + +// GetField returns InputWithDefaults.Field, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetField() string { return v.Field } + +// GetNullableField returns InputWithDefaults.NullableField, and is useful for accessing the field via an interface. +func (v *InputWithDefaults) GetNullableField() string { return v.NullableField } + +// __DefaultInputsInput is used internally by genqlient +type __DefaultInputsInput struct { + Input InputWithDefaults `json:"input"` +} + +// GetInput returns __DefaultInputsInput.Input, and is useful for accessing the field via an interface. +func (v *__DefaultInputsInput) GetInput() InputWithDefaults { return v.Input } + +// The query or mutation executed by DefaultInputs. +const DefaultInputs_Operation = ` +query DefaultInputs ($input: InputWithDefaults!) { + default(input: $input) +} +` + +func DefaultInputs( + client_ graphql.Client, + input InputWithDefaults, +) (*DefaultInputsResponse, error) { + req_ := &graphql.Request{ + OpName: "DefaultInputs", + Query: DefaultInputs_Operation, + Variables: &__DefaultInputsInput{ + Input: input, + }, + } + var err_ error + + var data_ DefaultInputsResponse + resp_ := &graphql.Response{Data: &data_} + + err_ = client_.MakeRequest( + nil, + req_, + resp_, + ) + + return &data_, err_ +} diff --git a/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.json b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.json new file mode 100644 index 00000000..b618fc03 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-DefaultInputsWithForDirective.graphql-DefaultInputsWithForDirective.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "DefaultInputs", + "query": "\nquery DefaultInputs ($input: InputWithDefaults!) {\n\tdefault(input: $input)\n}\n", + "sourceLocation": "testdata/queries/DefaultInputsWithForDirective.graphql" + } + ] +} diff --git a/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.go b/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.go new file mode 100644 index 00000000..7d932804 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.go @@ -0,0 +1,66 @@ +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +package test + +import ( + "github.com/Khan/genqlient/graphql" +) + +// OmitemptyFalseResponse is returned by OmitemptyFalse on success. +type OmitemptyFalseResponse struct { + Omitempty bool `json:"omitempty"` +} + +// GetOmitempty returns OmitemptyFalseResponse.Omitempty, and is useful for accessing the field via an interface. +func (v *OmitemptyFalseResponse) GetOmitempty() bool { return v.Omitempty } + +type OmitemptyInput struct { + Field string `json:"field"` + NullableField string `json:"nullableField,omitempty"` +} + +// GetField returns OmitemptyInput.Field, and is useful for accessing the field via an interface. +func (v *OmitemptyInput) GetField() string { return v.Field } + +// GetNullableField returns OmitemptyInput.NullableField, and is useful for accessing the field via an interface. +func (v *OmitemptyInput) GetNullableField() string { return v.NullableField } + +// __OmitemptyFalseInput is used internally by genqlient +type __OmitemptyFalseInput struct { + Input OmitemptyInput `json:"input,omitempty"` +} + +// GetInput returns __OmitemptyFalseInput.Input, and is useful for accessing the field via an interface. +func (v *__OmitemptyFalseInput) GetInput() OmitemptyInput { return v.Input } + +// The query or mutation executed by OmitemptyFalse. +const OmitemptyFalse_Operation = ` +query OmitemptyFalse ($input: OmitemptyInput) { + omitempty(input: $input) +} +` + +func OmitemptyFalse( + client_ graphql.Client, + input OmitemptyInput, +) (*OmitemptyFalseResponse, error) { + req_ := &graphql.Request{ + OpName: "OmitemptyFalse", + Query: OmitemptyFalse_Operation, + Variables: &__OmitemptyFalseInput{ + Input: input, + }, + } + var err_ error + + var data_ OmitemptyFalseResponse + resp_ := &graphql.Response{Data: &data_} + + err_ = client_.MakeRequest( + nil, + req_, + resp_, + ) + + return &data_, err_ +} diff --git a/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.json b/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.json new file mode 100644 index 00000000..8cd58706 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerate-OmitemptyFalse.graphql-OmitemptyFalse.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "OmitemptyFalse", + "query": "\nquery OmitemptyFalse ($input: OmitemptyInput) {\n\tomitempty(input: $input)\n}\n", + "sourceLocation": "testdata/queries/OmitemptyFalse.graphql" + } + ] +} diff --git a/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointer-graphql b/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointer-graphql new file mode 100644 index 00000000..25377c2e --- /dev/null +++ b/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointer-graphql @@ -0,0 +1 @@ +testdata/errors/DefaultInputsNoOmitPointer.graphql:4: pointer on non-null input field can only be used together with omitempty: InputWithDefaults.field diff --git a/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointerForDirective-graphql b/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointerForDirective-graphql new file mode 100644 index 00000000..b1f1efff --- /dev/null +++ b/generate/testdata/snapshots/TestGenerateErrors-DefaultInputsNoOmitPointerForDirective-graphql @@ -0,0 +1 @@ +testdata/errors/DefaultInputsNoOmitPointerForDirective.graphql:5: pointer on non-null input field can only be used together with omitempty: InputWithDefaults.field diff --git a/generate/testdata/snapshots/TestGenerateErrors-OmitemptyDirective-graphql b/generate/testdata/snapshots/TestGenerateErrors-OmitemptyDirective-graphql new file mode 100644 index 00000000..3d7a89a9 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerateErrors-OmitemptyDirective-graphql @@ -0,0 +1 @@ +testdata/errors/OmitemptyDirective.graphql:4: omitempty may only be used on optional arguments: OmitemptyInput.field diff --git a/generate/testdata/snapshots/TestGenerateErrors-OmitemptyForDirective-graphql b/generate/testdata/snapshots/TestGenerateErrors-OmitemptyForDirective-graphql new file mode 100644 index 00000000..0091ca34 --- /dev/null +++ b/generate/testdata/snapshots/TestGenerateErrors-OmitemptyForDirective-graphql @@ -0,0 +1 @@ +testdata/errors/OmitemptyForDirective.graphql:4: omitempty may only be used on optional arguments: OmitemptyInput.field