Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

InputObject field defaults are ignored/overridden #228

Open
kateile opened this issue Oct 13, 2022 · 2 comments
Open

InputObject field defaults are ignored/overridden #228

kateile opened this issue Oct 13, 2022 · 2 comments
Labels
bug Something isn't working
Milestone

Comments

@kateile
Copy link

kateile commented Oct 13, 2022

Describe the bug
Hi geeks, Thanks for this amazing lib. I have the following graphql input with default fields

input FormInput {
    hint: String
    inputType: MwappFormInputType = TEXT
    key: String = "form"
    label: String = "Fill form"
    maxLength: Int = 100
    multiSubmission: Boolean = false
    multiline: Boolean = false
    obscure: Boolean = false
}

input SendMessageInput {
    form: FormInput
}

type Mutation {
    sendMessage(connectionId: ID!, input: SendMessageInput!): String!
}

Which I use in golang like

mw.SendMessage(ConnectionId, mwapp.SendMessageInput{
		Message: "Hi, Please tell us your name. \n you can write it below",
		Form: &mwapp.FormInput{
			Key: FormKeyName.String(),
		},
	})

As you can see above I just use one field Key and ignore the rest. So I expect the default graphql fields specified in schema to be used when send request. But they are sent like null too.

To Reproduce
Create mutation whose input have fields with default fields

Expected behavior
Default fields to be respected when. I believe having pointer with omitempty in the generated code will be the solution. But I don't know how to archive this

genqlient version
v0.5.0

Additional context
My genqclient.yaml is

schema: schema.graphql
package: mwapp
operations:
- operations/*.graphql
generated: generated.go
use_struct_references : true
optional: pointer
bindings:
  Timestamp:
    type: time.Time

Any help on fixing this will be appreciated.

@kateile kateile added the bug Something isn't working label Oct 13, 2022
@benjaminjkraft
Copy link
Collaborator

Huh, I didn't realize input-object fields could have defaults! (For my future self: it's at InputObjectTypeDefinition which refers to InputValueDefinition.)

Does it work to use genqlient's omitempty option? For example you could add at the top of the file # @genqlient(for: "FormInput.inputType", omitempty: true), and so on for each field. (Obviously that's a bit verbose; we could talk about if there's a better way to do it, perhaps by extending #198 to allow an omitempty option.)

@benjaminjkraft benjaminjkraft changed the title Default graphql values are ignored when send request InputObject field defaults are ignored/overridden Dec 3, 2022
@benjaminjkraft benjaminjkraft added this to the v1.0 milestone Jan 26, 2024
@Fazt01
Copy link

Fazt01 commented Mar 27, 2024

Hi, yes the omitempty works -> the field is omitted in request and the server takes the default as value for that input field.

(tried with version github.com/Khan/genqlient v0.7.0)

One edge case, though, is when the field with default is non-null, e.g.

type Query {
  someQuery(input: Input!): String
}

input Input {
  inputField: Int! = 10
}

and I try to generate a request

# @genqlient(for: "Input.inputField", pointer: true, omitempty: true)
query MyQuery {
  $input: Input
} {
  someQuery(input: $input)
}

I get omitempty may only be used on optional arguments error, so in this case, I cannot specifically pick input fields that should respect the server default when empty.

I can, however, put omitempty to all fields by removing the for - without the above error

# @genqlient(pointer: true, omitempty: true)
query MyQuery {
  $input: Input
} {
  someQuery(input: $input)
}

which generates a structure as expected

type Input struct {
	InputField *int `json:"inputField,omitempty"`
}

IMO omitempty:false should be allowed to an input field that has a valid default (that is - it is nullable and it has not explicit default, or it has explicit default).
A bit related to #290 (false positive error on omitempty)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants