Skip to content

Commit a10c2af

Browse files
authored
Merge pull request #485 from elimirks/main
refs #439. Fix skip_serializing_none for root level variables
2 parents 88f2875 + f90619c commit a10c2af

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

graphql_client/tests/skip_serializing_none.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ fn skip_serializing_none() {
1313
use skip_serializing_none_mutation::*;
1414

1515
let query = SkipSerializingNoneMutation::build_query(Variables {
16+
optional_int: None,
17+
optional_list: None,
18+
non_optional_int: 1337,
19+
non_optional_list: vec![],
1620
param: Some(Param {
1721
data: Author {
1822
name: "test".to_owned(),
@@ -25,5 +29,29 @@ fn skip_serializing_none() {
2529

2630
println!("{}", stringified);
2731

28-
assert!(stringified.contains(r#""data":{"name":"test"}"#));
32+
assert!(stringified.contains(r#""param":{"data":{"name":"test"}}"#));
33+
assert!(stringified.contains(r#""nonOptionalInt":1337"#));
34+
assert!(stringified.contains(r#""nonOptionalList":[]"#));
35+
assert!(!stringified.contains(r#""optionalInt""#));
36+
assert!(!stringified.contains(r#""optionalList""#));
37+
38+
let query = SkipSerializingNoneMutation::build_query(Variables {
39+
optional_int: Some(42),
40+
optional_list: Some(vec![]),
41+
non_optional_int: 1337,
42+
non_optional_list: vec![],
43+
param: Some(Param {
44+
data: Author {
45+
name: "test".to_owned(),
46+
id: None,
47+
},
48+
}),
49+
});
50+
let stringified = serde_json::to_string(&query).expect("SkipSerializingNoneMutation is valid");
51+
println!("{}", stringified);
52+
assert!(stringified.contains(r#""param":{"data":{"name":"test"}}"#));
53+
assert!(stringified.contains(r#""nonOptionalInt":1337"#));
54+
assert!(stringified.contains(r#""nonOptionalList":[]"#));
55+
assert!(stringified.contains(r#""optionalInt":42"#));
56+
assert!(stringified.contains(r#""optionalList":[]"#));
2957
}

graphql_client/tests/skip_serializing_none/query.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
mutation SkipSerializingNoneMutation($param: Param) {
1+
mutation SkipSerializingNoneMutation($param: Param, $optionalInt: Int, $optionalList: [Int!], $nonOptionalInt: Int!, $nonOptionalList: [Int!]!) {
22
optInput(query: $param) {
33
name
44
__typename

graphql_client_codegen/src/codegen.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,19 @@ fn generate_variable_struct_field(
142142
let snake_case_name = variable.name.to_snake_case();
143143
let safe_name = shared::keyword_replace(&snake_case_name);
144144
let ident = Ident::new(&safe_name, Span::call_site());
145-
let annotation = shared::field_rename_annotation(&variable.name, &safe_name);
145+
let rename_annotation = shared::field_rename_annotation(&variable.name, &safe_name);
146+
let skip_serializing_annotation = if *options.skip_serializing_none() {
147+
if variable.r#type.qualifiers.first() != Some(&GraphqlTypeQualifier::Required) {
148+
Some(quote!(#[serde(skip_serializing_if = "Option::is_none")]))
149+
} else {
150+
None
151+
}
152+
} else {
153+
None
154+
};
146155
let r#type = render_variable_field_type(variable, options, query);
147156

148-
quote::quote!(#annotation pub #ident : #r#type)
157+
quote::quote!(#skip_serializing_annotation #rename_annotation pub #ident : #r#type)
149158
}
150159

151160
fn generate_scalar_definitions<'a, 'schema: 'a>(

0 commit comments

Comments
 (0)