diff --git a/codegen/lib/graphql_swift_gen/templates/type.swift.erb b/codegen/lib/graphql_swift_gen/templates/type.swift.erb index 4731dbb..50a1591 100644 --- a/codegen/lib/graphql_swift_gen/templates/type.swift.erb +++ b/codegen/lib/graphql_swift_gen/templates/type.swift.erb @@ -214,25 +214,29 @@ extension <%= schema_name %> { <% when 'INPUT_OBJECT' %> open class <%= type.name %> { <% type.required_input_fields.each do |field| %> - open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> + + open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %> <% end %> <% type.optional_input_fields.each do |field| %> + open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> { didSet { - <%= escape_reserved_word(field.camelize_name) %>Seen = true + serialize<%= escape_reserved_word(field.classify_name) %> = true } } - private var <%= escape_reserved_word(field.camelize_name) %>Seen: Bool = false + // Observes if the <%= escape_reserved_word(field.camelize_name) %> property was set, and indicates whether it should be serialized. + open var serialize<%= escape_reserved_word(field.classify_name) %>: Bool <% end %> public init( <% input_fields = type.required_input_fields + type.optional_input_fields # manually ordered with required fields first %> <% input_fields.each do |field| %> - <% seperator = field == input_fields.last ? "" : "," %> + <% separator = field == input_fields.last ? "" : "," %> <% if field.type.non_null? %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %><%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %><%= separator %> <% else %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %>? = nil<%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> = nil, + serialize<%= escape_reserved_word(field.classify_name) %>: Bool = false<%= separator %> <% end %> <% end %> ) { @@ -240,10 +244,11 @@ extension <%= schema_name %> { self.<%= escape_reserved_word(field.camelize_name) %> = <%= escape_reserved_word(field.camelize_name) %> <% end %> <% type.optional_input_fields.each do |field| %> + self.serialize<%= escape_reserved_word(field.classify_name) %> = serialize<%= escape_reserved_word(field.classify_name) %> <% field_name = escape_reserved_word(field.camelize_name) %> if let <%= field_name %> = <%= field_name %> { - self.<%= field_name %>Seen = true self.<%= field_name %> = <%= field_name %> + self.serialize<%= escape_reserved_word(field.classify_name) %> = true } <% end %> } @@ -254,7 +259,7 @@ extension <%= schema_name %> { fields.append("<%= field.name %>:<%= generate_build_input_code(field.camelize_name, field.type.unwrap_non_null) %>") <% end %> <% type.optional_input_fields.each do |field| %> - if <%= escape_reserved_word(field.camelize_name) %>Seen { + if serialize<%= escape_reserved_word(field.classify_name) %> { if let <%= escape_reserved_word(field.camelize_name) %> = <%= escape_reserved_word(field.camelize_name) %> { fields.append("<%= field.name %>:<%= generate_build_input_code(field.camelize_name, field.type.unwrap_non_null) %>") } else { diff --git a/support/Tests/GraphQLSupportTests/IntegrationTests.swift b/support/Tests/GraphQLSupportTests/IntegrationTests.swift index 02921eb..7c46bf3 100644 --- a/support/Tests/GraphQLSupportTests/IntegrationTests.swift +++ b/support/Tests/GraphQLSupportTests/IntegrationTests.swift @@ -68,9 +68,17 @@ class IntegrationTests: XCTestCase { XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42,negate:true})}") } - func testInputObjectExplictNilConstructor() { + func testInputObjectOptionalFieldNilConstructor() { let query = Generated.buildMutation { $0 - .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: .some(nil))) + .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: nil)) + } + let queryString = String(describing: query) + XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42})}") + } + + func testInputObjectOptionalFieldExplictNilConstructor() { + let query = Generated.buildMutation { $0 + .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: nil, serializeNegate: true)) } let queryString = String(describing: query) XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42,negate:null})}")