Skip to content

Commit 0309c86

Browse files
committed
skip serializing struct fields that are None
Right now it writes something like: {"foobar": null} which might work with the actual Python API code, but is unnecessarily verbose, and doesn't work with our own deserializer, and round-tripping is a desirable feature. We could change the deserializers to accept `null` as a value for `Option` types (maybe even in addition to this change) but the API doesn't send JSON that way and IMO it's unnecessary to be able to read that in.
1 parent 9de0f5c commit 0309c86

19 files changed

+4344
-1681
lines changed

RELEASE_NOTES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ xxxx-yy-zz
55
* 2021-06-30: (breaking change) remove deprecated sharing::change_file_member_access
66
function and associated structs
77
* 2021-07-08: sharing namespace additions
8+
* Changed struct serialization to not emit fields at all where the value is `None`.
9+
* (previously it emitted `null` into the JSON as the value of the fields)
810

911
# v0.11.3
1012
2021-05-08

generator/rust.stoneg.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -428,13 +428,13 @@ def _impl_serde_for_struct(self, struct):
428428
u'Result<(), S::Error>',
429429
access=u'pub(crate)'):
430430
self.emit(u'use serde::ser::SerializeStruct;')
431-
self.generate_multiline_list(
432-
list(u's.serialize_field("{}", &self.{})'
433-
.format(field.name, self.field_name(field))
434-
for field in struct.all_fields),
435-
delim=(u'', u''),
436-
sep='?;',
437-
skip_last_sep=True)
431+
for field in struct.all_fields:
432+
if ir.is_nullable_type(field.data_type):
433+
with self.block(u'if let Some(val) = &self.{}'.format(self.field_name(field))):
434+
self.emit(u's.serialize_field("{}", val)?;'.format(field.name))
435+
else:
436+
self.emit(u's.serialize_field("{}", &self.{})?;'.format(field.name, self.field_name(field)))
437+
self.emit(u'Ok(())')
438438
self.emit()
439439
with self._impl_deserialize(self.struct_name(struct)):
440440
self.emit(u'// struct deserializer')

src/generated/account.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ impl SetProfilePhotoArg {
141141
s: &mut S::SerializeStruct,
142142
) -> Result<(), S::Error> {
143143
use serde::ser::SerializeStruct;
144-
s.serialize_field("photo", &self.photo)
144+
s.serialize_field("photo", &self.photo)?;
145+
Ok(())
145146
}
146147
}
147148

@@ -342,7 +343,8 @@ impl SetProfilePhotoResult {
342343
s: &mut S::SerializeStruct,
343344
) -> Result<(), S::Error> {
344345
use serde::ser::SerializeStruct;
345-
s.serialize_field("profile_photo_url", &self.profile_photo_url)
346+
s.serialize_field("profile_photo_url", &self.profile_photo_url)?;
347+
Ok(())
346348
}
347349
}
348350

src/generated/auth.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,8 @@ impl RateLimitError {
504504
) -> Result<(), S::Error> {
505505
use serde::ser::SerializeStruct;
506506
s.serialize_field("reason", &self.reason)?;
507-
s.serialize_field("retry_after", &self.retry_after)
507+
s.serialize_field("retry_after", &self.retry_after)?;
508+
Ok(())
508509
}
509510
}
510511

@@ -672,7 +673,8 @@ impl TokenFromOAuth1Arg {
672673
) -> Result<(), S::Error> {
673674
use serde::ser::SerializeStruct;
674675
s.serialize_field("oauth1_token", &self.oauth1_token)?;
675-
s.serialize_field("oauth1_token_secret", &self.oauth1_token_secret)
676+
s.serialize_field("oauth1_token_secret", &self.oauth1_token_secret)?;
677+
Ok(())
676678
}
677679
}
678680

@@ -840,7 +842,8 @@ impl TokenFromOAuth1Result {
840842
s: &mut S::SerializeStruct,
841843
) -> Result<(), S::Error> {
842844
use serde::ser::SerializeStruct;
843-
s.serialize_field("oauth2_token", &self.oauth2_token)
845+
s.serialize_field("oauth2_token", &self.oauth2_token)?;
846+
Ok(())
844847
}
845848
}
846849

@@ -930,7 +933,8 @@ impl TokenScopeError {
930933
s: &mut S::SerializeStruct,
931934
) -> Result<(), S::Error> {
932935
use serde::ser::SerializeStruct;
933-
s.serialize_field("required_scope", &self.required_scope)
936+
s.serialize_field("required_scope", &self.required_scope)?;
937+
Ok(())
934938
}
935939
}
936940

src/generated/check.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ impl EchoArg {
9797
s: &mut S::SerializeStruct,
9898
) -> Result<(), S::Error> {
9999
use serde::ser::SerializeStruct;
100-
s.serialize_field("query", &self.query)
100+
s.serialize_field("query", &self.query)?;
101+
Ok(())
101102
}
102103
}
103104

@@ -184,7 +185,8 @@ impl EchoResult {
184185
s: &mut S::SerializeStruct,
185186
) -> Result<(), S::Error> {
186187
use serde::ser::SerializeStruct;
187-
s.serialize_field("result", &self.result)
188+
s.serialize_field("result", &self.result)?;
189+
Ok(())
188190
}
189191
}
190192

src/generated/common.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ impl TeamRootInfo {
357357
use serde::ser::SerializeStruct;
358358
s.serialize_field("root_namespace_id", &self.root_namespace_id)?;
359359
s.serialize_field("home_namespace_id", &self.home_namespace_id)?;
360-
s.serialize_field("home_path", &self.home_path)
360+
s.serialize_field("home_path", &self.home_path)?;
361+
Ok(())
361362
}
362363
}
363364

@@ -464,7 +465,8 @@ impl UserRootInfo {
464465
) -> Result<(), S::Error> {
465466
use serde::ser::SerializeStruct;
466467
s.serialize_field("root_namespace_id", &self.root_namespace_id)?;
467-
s.serialize_field("home_namespace_id", &self.home_namespace_id)
468+
s.serialize_field("home_namespace_id", &self.home_namespace_id)?;
469+
Ok(())
468470
}
469471
}
470472

src/generated/contacts.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ impl DeleteManualContactsArg {
9393
s: &mut S::SerializeStruct,
9494
) -> Result<(), S::Error> {
9595
use serde::ser::SerializeStruct;
96-
s.serialize_field("email_addresses", &self.email_addresses)
96+
s.serialize_field("email_addresses", &self.email_addresses)?;
97+
Ok(())
9798
}
9899
}
99100

src/generated/dbx_async.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ impl PollArg {
199199
s: &mut S::SerializeStruct,
200200
) -> Result<(), S::Error> {
201201
use serde::ser::SerializeStruct;
202-
s.serialize_field("async_job_id", &self.async_job_id)
202+
s.serialize_field("async_job_id", &self.async_job_id)?;
203+
Ok(())
203204
}
204205
}
205206

src/generated/file_properties.rs

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,8 @@ impl AddPropertiesArg {
367367
) -> Result<(), S::Error> {
368368
use serde::ser::SerializeStruct;
369369
s.serialize_field("path", &self.path)?;
370-
s.serialize_field("property_groups", &self.property_groups)
370+
s.serialize_field("property_groups", &self.property_groups)?;
371+
Ok(())
371372
}
372373
}
373374

@@ -647,7 +648,8 @@ impl AddTemplateArg {
647648
use serde::ser::SerializeStruct;
648649
s.serialize_field("name", &self.name)?;
649650
s.serialize_field("description", &self.description)?;
650-
s.serialize_field("fields", &self.fields)
651+
s.serialize_field("fields", &self.fields)?;
652+
Ok(())
651653
}
652654
}
653655

@@ -739,7 +741,8 @@ impl AddTemplateResult {
739741
s: &mut S::SerializeStruct,
740742
) -> Result<(), S::Error> {
741743
use serde::ser::SerializeStruct;
742-
s.serialize_field("template_id", &self.template_id)
744+
s.serialize_field("template_id", &self.template_id)?;
745+
Ok(())
743746
}
744747
}
745748

@@ -831,7 +834,8 @@ impl GetTemplateArg {
831834
s: &mut S::SerializeStruct,
832835
) -> Result<(), S::Error> {
833836
use serde::ser::SerializeStruct;
834-
s.serialize_field("template_id", &self.template_id)
837+
s.serialize_field("template_id", &self.template_id)?;
838+
Ok(())
835839
}
836840
}
837841

@@ -948,7 +952,8 @@ impl GetTemplateResult {
948952
use serde::ser::SerializeStruct;
949953
s.serialize_field("name", &self.name)?;
950954
s.serialize_field("description", &self.description)?;
951-
s.serialize_field("fields", &self.fields)
955+
s.serialize_field("fields", &self.fields)?;
956+
Ok(())
952957
}
953958
}
954959

@@ -1192,7 +1197,8 @@ impl ListTemplateResult {
11921197
s: &mut S::SerializeStruct,
11931198
) -> Result<(), S::Error> {
11941199
use serde::ser::SerializeStruct;
1195-
s.serialize_field("template_ids", &self.template_ids)
1200+
s.serialize_field("template_ids", &self.template_ids)?;
1201+
Ok(())
11961202
}
11971203
}
11981204

@@ -1667,7 +1673,8 @@ impl OverwritePropertyGroupArg {
16671673
) -> Result<(), S::Error> {
16681674
use serde::ser::SerializeStruct;
16691675
s.serialize_field("path", &self.path)?;
1670-
s.serialize_field("property_groups", &self.property_groups)
1676+
s.serialize_field("property_groups", &self.property_groups)?;
1677+
Ok(())
16711678
}
16721679
}
16731680

@@ -1894,7 +1901,8 @@ impl PropertiesSearchArg {
18941901
) -> Result<(), S::Error> {
18951902
use serde::ser::SerializeStruct;
18961903
s.serialize_field("queries", &self.queries)?;
1897-
s.serialize_field("template_filter", &self.template_filter)
1904+
s.serialize_field("template_filter", &self.template_filter)?;
1905+
Ok(())
18981906
}
18991907
}
19001908

@@ -1985,7 +1993,8 @@ impl PropertiesSearchContinueArg {
19851993
s: &mut S::SerializeStruct,
19861994
) -> Result<(), S::Error> {
19871995
use serde::ser::SerializeStruct;
1988-
s.serialize_field("cursor", &self.cursor)
1996+
s.serialize_field("cursor", &self.cursor)?;
1997+
Ok(())
19891998
}
19901999
}
19912000

@@ -2263,7 +2272,8 @@ impl PropertiesSearchMatch {
22632272
s.serialize_field("id", &self.id)?;
22642273
s.serialize_field("path", &self.path)?;
22652274
s.serialize_field("is_deleted", &self.is_deleted)?;
2266-
s.serialize_field("property_groups", &self.property_groups)
2275+
s.serialize_field("property_groups", &self.property_groups)?;
2276+
Ok(())
22672277
}
22682278
}
22692279

@@ -2446,7 +2456,8 @@ impl PropertiesSearchQuery {
24462456
use serde::ser::SerializeStruct;
24472457
s.serialize_field("query", &self.query)?;
24482458
s.serialize_field("mode", &self.mode)?;
2449-
s.serialize_field("logical_operator", &self.logical_operator)
2459+
s.serialize_field("logical_operator", &self.logical_operator)?;
2460+
Ok(())
24502461
}
24512462
}
24522463

@@ -2555,7 +2566,10 @@ impl PropertiesSearchResult {
25552566
) -> Result<(), S::Error> {
25562567
use serde::ser::SerializeStruct;
25572568
s.serialize_field("matches", &self.matches)?;
2558-
s.serialize_field("cursor", &self.cursor)
2569+
if let Some(val) = &self.cursor {
2570+
s.serialize_field("cursor", val)?;
2571+
}
2572+
Ok(())
25592573
}
25602574
}
25612575

@@ -2661,7 +2675,8 @@ impl PropertyField {
26612675
) -> Result<(), S::Error> {
26622676
use serde::ser::SerializeStruct;
26632677
s.serialize_field("name", &self.name)?;
2664-
s.serialize_field("value", &self.value)
2678+
s.serialize_field("value", &self.value)?;
2679+
Ok(())
26652680
}
26662681
}
26672682

@@ -2780,7 +2795,8 @@ impl PropertyFieldTemplate {
27802795
use serde::ser::SerializeStruct;
27812796
s.serialize_field("name", &self.name)?;
27822797
s.serialize_field("description", &self.description)?;
2783-
s.serialize_field("type", &self.type_field)
2798+
s.serialize_field("type", &self.type_field)?;
2799+
Ok(())
27842800
}
27852801
}
27862802

@@ -2888,7 +2904,8 @@ impl PropertyGroup {
28882904
) -> Result<(), S::Error> {
28892905
use serde::ser::SerializeStruct;
28902906
s.serialize_field("template_id", &self.template_id)?;
2891-
s.serialize_field("fields", &self.fields)
2907+
s.serialize_field("fields", &self.fields)?;
2908+
Ok(())
28922909
}
28932910
}
28942911

@@ -3006,7 +3023,8 @@ impl PropertyGroupTemplate {
30063023
use serde::ser::SerializeStruct;
30073024
s.serialize_field("name", &self.name)?;
30083025
s.serialize_field("description", &self.description)?;
3009-
s.serialize_field("fields", &self.fields)
3026+
s.serialize_field("fields", &self.fields)?;
3027+
Ok(())
30103028
}
30113029
}
30123030

@@ -3132,8 +3150,13 @@ impl PropertyGroupUpdate {
31323150
) -> Result<(), S::Error> {
31333151
use serde::ser::SerializeStruct;
31343152
s.serialize_field("template_id", &self.template_id)?;
3135-
s.serialize_field("add_or_update_fields", &self.add_or_update_fields)?;
3136-
s.serialize_field("remove_fields", &self.remove_fields)
3153+
if let Some(val) = &self.add_or_update_fields {
3154+
s.serialize_field("add_or_update_fields", val)?;
3155+
}
3156+
if let Some(val) = &self.remove_fields {
3157+
s.serialize_field("remove_fields", val)?;
3158+
}
3159+
Ok(())
31373160
}
31383161
}
31393162

@@ -3294,7 +3317,8 @@ impl RemovePropertiesArg {
32943317
) -> Result<(), S::Error> {
32953318
use serde::ser::SerializeStruct;
32963319
s.serialize_field("path", &self.path)?;
3297-
s.serialize_field("property_template_ids", &self.property_template_ids)
3320+
s.serialize_field("property_template_ids", &self.property_template_ids)?;
3321+
Ok(())
32983322
}
32993323
}
33003324

@@ -3522,7 +3546,8 @@ impl RemoveTemplateArg {
35223546
s: &mut S::SerializeStruct,
35233547
) -> Result<(), S::Error> {
35243548
use serde::ser::SerializeStruct;
3525-
s.serialize_field("template_id", &self.template_id)
3549+
s.serialize_field("template_id", &self.template_id)?;
3550+
Ok(())
35263551
}
35273552
}
35283553

@@ -3911,7 +3936,8 @@ impl UpdatePropertiesArg {
39113936
) -> Result<(), S::Error> {
39123937
use serde::ser::SerializeStruct;
39133938
s.serialize_field("path", &self.path)?;
3914-
s.serialize_field("update_property_groups", &self.update_property_groups)
3939+
s.serialize_field("update_property_groups", &self.update_property_groups)?;
3940+
Ok(())
39153941
}
39163942
}
39173943

@@ -4226,9 +4252,16 @@ impl UpdateTemplateArg {
42264252
) -> Result<(), S::Error> {
42274253
use serde::ser::SerializeStruct;
42284254
s.serialize_field("template_id", &self.template_id)?;
4229-
s.serialize_field("name", &self.name)?;
4230-
s.serialize_field("description", &self.description)?;
4231-
s.serialize_field("add_fields", &self.add_fields)
4255+
if let Some(val) = &self.name {
4256+
s.serialize_field("name", val)?;
4257+
}
4258+
if let Some(val) = &self.description {
4259+
s.serialize_field("description", val)?;
4260+
}
4261+
if let Some(val) = &self.add_fields {
4262+
s.serialize_field("add_fields", val)?;
4263+
}
4264+
Ok(())
42324265
}
42334266
}
42344267

@@ -4320,7 +4353,8 @@ impl UpdateTemplateResult {
43204353
s: &mut S::SerializeStruct,
43214354
) -> Result<(), S::Error> {
43224355
use serde::ser::SerializeStruct;
4323-
s.serialize_field("template_id", &self.template_id)
4356+
s.serialize_field("template_id", &self.template_id)?;
4357+
Ok(())
43244358
}
43254359
}
43264360

0 commit comments

Comments
 (0)