Skip to content

Commit 79be19f

Browse files
authored
Add serde_with::skip_serializing_none macro (#94)
* add serde_with dependency * apply skip_serializing_none macro * finish applying skip_if_none macro * fix typo * fix typo
1 parent a803133 commit 79be19f

File tree

16 files changed

+632
-994
lines changed

16 files changed

+632
-994
lines changed

plotly/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ once_cell = "1"
3232
serde = { version = "1.0.132", features = ["derive"] }
3333
serde_json = "1.0.73"
3434
serde_repr = "0.1"
35+
serde_with = "2"
3536
rand = "0.8"
3637
rand_distr = "0.4"
3738
wasm-bindgen = { version = "0.2", optional = true }

plotly/src/common/mod.rs

Lines changed: 57 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ pub enum HoverInfo {
5353
Skip,
5454
}
5555

56+
#[serde_with::skip_serializing_none]
5657
#[derive(Serialize, Clone, Debug, Default)]
5758
pub struct LegendGroupTitle {
5859
text: String,
59-
#[serde(skip_serializing_if = "Option::is_none")]
6060
font: Option<Font>,
6161
}
6262

@@ -74,15 +74,12 @@ impl LegendGroupTitle {
7474
}
7575
}
7676

77+
#[serde_with::skip_serializing_none]
7778
#[derive(Serialize, Clone, Debug, Default)]
7879
pub struct Domain {
79-
#[serde(skip_serializing_if = "Option::is_none")]
8080
column: Option<usize>,
81-
#[serde(skip_serializing_if = "Option::is_none")]
8281
row: Option<usize>,
83-
#[serde(skip_serializing_if = "Option::is_none")]
8482
x: Option<[f64; 2]>,
85-
#[serde(skip_serializing_if = "Option::is_none")]
8683
y: Option<[f64; 2]>,
8784
}
8885

@@ -490,37 +487,28 @@ pub enum LineShape {
490487
Vhv,
491488
}
492489

490+
#[serde_with::skip_serializing_none]
493491
#[derive(Serialize, Clone, Debug, Default)]
494492
pub struct Line {
495-
#[serde(skip_serializing_if = "Option::is_none")]
496493
width: Option<f64>,
497-
#[serde(skip_serializing_if = "Option::is_none")]
498494
shape: Option<LineShape>,
499-
#[serde(skip_serializing_if = "Option::is_none")]
500495
smoothing: Option<f64>,
501-
#[serde(skip_serializing_if = "Option::is_none")]
502496
dash: Option<DashType>,
503-
#[serde(skip_serializing_if = "Option::is_none")]
504497
simplify: Option<bool>,
505-
#[serde(skip_serializing_if = "Option::is_none")]
506498
color: Option<Box<dyn Color>>,
507-
#[serde(skip_serializing_if = "Option::is_none")]
508499
cauto: Option<bool>,
509-
#[serde(skip_serializing_if = "Option::is_none")]
510500
cmin: Option<f64>,
511-
#[serde(skip_serializing_if = "Option::is_none")]
512501
cmax: Option<f64>,
513-
#[serde(skip_serializing_if = "Option::is_none")]
514502
cmid: Option<f64>,
515-
#[serde(skip_serializing_if = "Option::is_none", rename = "colorscale")]
503+
#[serde(rename = "colorscale")]
516504
color_scale: Option<ColorScale>,
517-
#[serde(skip_serializing_if = "Option::is_none", rename = "autocolorscale")]
505+
#[serde(rename = "autocolorscale")]
518506
auto_color_scale: Option<bool>,
519-
#[serde(skip_serializing_if = "Option::is_none", rename = "reversescale")]
507+
#[serde(rename = "reversescale")]
520508
reverse_scale: Option<bool>,
521-
#[serde(skip_serializing_if = "Option::is_none", rename = "outliercolor")]
509+
#[serde(rename = "outliercolor")]
522510
outlier_color: Option<Box<dyn Color>>,
523-
#[serde(skip_serializing_if = "Option::is_none", rename = "outlierwidth")]
511+
#[serde(rename = "outlierwidth")]
524512
outlier_width: Option<usize>,
525513
}
526514

@@ -685,16 +673,15 @@ impl Gradient {
685673
}
686674
}
687675

676+
#[serde_with::skip_serializing_none]
688677
#[derive(Serialize, Clone, Debug, Default)]
689678
pub struct TickFormatStop {
690679
enabled: bool,
691-
#[serde(skip_serializing_if = "Option::is_none", rename = "dtickrange")]
680+
#[serde(rename = "dtickrange")]
692681
dtick_range: Option<private::NumOrStringCollection>,
693-
#[serde(skip_serializing_if = "Option::is_none")]
694682
value: Option<String>,
695-
#[serde(skip_serializing_if = "Option::is_none")]
696683
name: Option<String>,
697-
#[serde(skip_serializing_if = "Option::is_none", rename = "templateitemname")]
684+
#[serde(rename = "templateitemname")]
698685
template_item_name: Option<String>,
699686
}
700687

@@ -732,12 +719,13 @@ impl TickFormatStop {
732719
}
733720
}
734721

722+
#[serde_with::skip_serializing_none]
735723
#[derive(Serialize, Clone, Debug)]
736724
pub struct ColorBar {
737-
#[serde(skip_serializing_if = "Option::is_none", rename = "thicknessmode")]
725+
#[serde(rename = "thicknessmode")]
738726
thickness_mode: Option<ThicknessMode>,
739727
thickness: usize,
740-
#[serde(skip_serializing_if = "Option::is_none", rename = "lenmode")]
728+
#[serde(rename = "lenmode")]
741729
len_mode: Option<ThicknessMode>,
742730
len: usize,
743731
x: f64,
@@ -750,60 +738,56 @@ pub struct ColorBar {
750738
y_anchor: Anchor,
751739
#[serde(rename = "ypad")]
752740
y_pad: f64,
753-
#[serde(skip_serializing_if = "Option::is_none", rename = "outlinecolor")]
741+
#[serde(rename = "outlinecolor")]
754742
outline_color: Option<Box<dyn Color>>,
755743
#[serde(rename = "outlinewidth")]
756744
outline_width: usize,
757-
#[serde(skip_serializing_if = "Option::is_none", rename = "bordercolor")]
745+
#[serde(rename = "bordercolor")]
758746
border_color: Option<Box<dyn Color>>,
759747
#[serde(rename = "borderwidth")]
760748
border_width: usize,
761-
#[serde(skip_serializing_if = "Option::is_none", rename = "bgcolor")]
749+
#[serde(rename = "bgcolor")]
762750
background_color: Option<Box<dyn Color>>,
763-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickmode")]
751+
#[serde(rename = "tickmode")]
764752
tick_mode: Option<TickMode>,
765753
#[serde(rename = "nticks")]
766754
n_ticks: usize,
767-
#[serde(skip_serializing_if = "Option::is_none")]
768755
tick0: Option<f64>,
769-
#[serde(skip_serializing_if = "Option::is_none")]
770756
dtick: Option<f64>,
771-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickvals")]
757+
#[serde(rename = "tickvals")]
772758
tick_vals: Option<Vec<f64>>,
773-
#[serde(skip_serializing_if = "Option::is_none", rename = "ticktext")]
759+
#[serde(rename = "ticktext")]
774760
tick_text: Option<Vec<String>>,
775-
#[serde(skip_serializing_if = "Option::is_none")]
776761
ticks: Option<String>,
777762
#[serde(rename = "ticklen")]
778763
tick_len: usize,
779764
#[serde(rename = "tickwidth")]
780765
tick_width: usize,
781-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickcolor")]
766+
#[serde(rename = "tickcolor")]
782767
tick_color: Option<Box<dyn Color>>,
783768
#[serde(rename = "showticklabels")]
784769
show_tick_labels: bool,
785-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickfont")]
770+
#[serde(rename = "tickfont")]
786771
tick_font: Option<Font>,
787-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickangle")]
772+
#[serde(rename = "tickangle")]
788773
tick_angle: Option<f64>,
789-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickformat")]
774+
#[serde(rename = "tickformat")]
790775
tick_format: Option<String>,
791-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickformatstops")]
776+
#[serde(rename = "tickformatstops")]
792777
tick_format_stops: Option<Vec<TickFormatStop>>,
793-
#[serde(skip_serializing_if = "Option::is_none", rename = "tickprefix")]
778+
#[serde(rename = "tickprefix")]
794779
tick_prefix: Option<String>,
795-
#[serde(skip_serializing_if = "Option::is_none", rename = "showtickprefix")]
780+
#[serde(rename = "showtickprefix")]
796781
show_tick_prefix: Option<String>,
797-
#[serde(skip_serializing_if = "Option::is_none", rename = "ticksuffix")]
782+
#[serde(rename = "ticksuffix")]
798783
tick_suffix: Option<String>,
799-
#[serde(skip_serializing_if = "Option::is_none", rename = "showticksuffix")]
784+
#[serde(rename = "showticksuffix")]
800785
show_tick_suffix: Option<String>,
801786
separate_thousands: bool,
802-
#[serde(skip_serializing_if = "Option::is_none", rename = "exponentformat")]
787+
#[serde(rename = "exponentformat")]
803788
exponent_format: Option<ExponentFormat>,
804-
#[serde(skip_serializing_if = "Option::is_none", rename = "showexponent")]
789+
#[serde(rename = "showexponent")]
805790
show_exponent: Option<String>,
806-
#[serde(skip_serializing_if = "Option::is_none")]
807791
title: Option<Title>,
808792
}
809793

@@ -1057,47 +1041,38 @@ pub enum AxisSide {
10571041
Right,
10581042
}
10591043

1044+
#[serde_with::skip_serializing_none]
10601045
#[derive(Serialize, Clone, Debug, Default)]
10611046
pub struct Marker {
1062-
#[serde(skip_serializing_if = "Option::is_none")]
10631047
symbol: Option<MarkerSymbol>,
1064-
#[serde(skip_serializing_if = "Option::is_none")]
10651048
opacity: Option<f64>,
1066-
#[serde(skip_serializing_if = "Option::is_none")]
10671049
size: Option<Dim<usize>>,
1068-
#[serde(skip_serializing_if = "Option::is_none", rename = "maxdisplayed")]
1050+
#[serde(rename = "maxdisplayed")]
10691051
max_displayed: Option<usize>,
1070-
#[serde(skip_serializing_if = "Option::is_none", rename = "sizeref")]
1052+
#[serde(rename = "sizeref")]
10711053
size_ref: Option<usize>,
1072-
#[serde(skip_serializing_if = "Option::is_none", rename = "sizemin")]
1054+
#[serde(rename = "sizemin")]
10731055
size_min: Option<usize>,
1074-
#[serde(skip_serializing_if = "Option::is_none", rename = "sizemode")]
1056+
#[serde(rename = "sizemode")]
10751057
size_mode: Option<SizeMode>,
1076-
#[serde(skip_serializing_if = "Option::is_none")]
10771058
line: Option<Line>,
1078-
#[serde(skip_serializing_if = "Option::is_none")]
10791059
gradient: Option<Gradient>,
1080-
#[serde(skip_serializing_if = "Option::is_none")]
10811060
color: Option<Dim<Box<dyn Color>>>,
1082-
#[serde(skip_serializing_if = "Option::is_none")]
10831061
cauto: Option<bool>,
1084-
#[serde(skip_serializing_if = "Option::is_none")]
10851062
cmin: Option<f64>,
1086-
#[serde(skip_serializing_if = "Option::is_none")]
10871063
cmax: Option<f64>,
1088-
#[serde(skip_serializing_if = "Option::is_none")]
10891064
cmid: Option<f64>,
1090-
#[serde(skip_serializing_if = "Option::is_none", rename = "colorscale")]
1065+
#[serde(rename = "colorscale")]
10911066
color_scale: Option<ColorScale>,
1092-
#[serde(skip_serializing_if = "Option::is_none", rename = "autocolorscale")]
1067+
#[serde(rename = "autocolorscale")]
10931068
auto_color_scale: Option<bool>,
1094-
#[serde(skip_serializing_if = "Option::is_none", rename = "reversescale")]
1069+
#[serde(rename = "reversescale")]
10951070
reverse_scale: Option<bool>,
1096-
#[serde(skip_serializing_if = "Option::is_none", rename = "showscale")]
1071+
#[serde(rename = "showscale")]
10971072
show_scale: Option<bool>,
1098-
#[serde(skip_serializing_if = "Option::is_none", rename = "colorbar")]
1073+
#[serde(rename = "colorbar")]
10991074
color_bar: Option<ColorBar>,
1100-
#[serde(skip_serializing_if = "Option::is_none", rename = "outliercolor")]
1075+
#[serde(rename = "outliercolor")]
11011076
outlier_color: Option<Box<dyn Color>>,
11021077
}
11031078

@@ -1217,13 +1192,11 @@ impl Marker {
12171192
}
12181193
}
12191194

1195+
#[serde_with::skip_serializing_none]
12201196
#[derive(Serialize, Clone, Debug, Default)]
12211197
pub struct Font {
1222-
#[serde(skip_serializing_if = "Option::is_none")]
12231198
family: Option<String>,
1224-
#[serde(skip_serializing_if = "Option::is_none")]
12251199
size: Option<usize>,
1226-
#[serde(skip_serializing_if = "Option::is_none")]
12271200
color: Option<Box<dyn Color>>,
12281201
}
12291202

@@ -1279,26 +1252,22 @@ impl Pad {
12791252
}
12801253
}
12811254

1255+
#[serde_with::skip_serializing_none]
12821256
#[derive(Serialize, Clone, Debug, Default)]
12831257
pub struct Title {
12841258
text: String,
1285-
#[serde(skip_serializing_if = "Option::is_none")]
12861259
font: Option<Font>,
1287-
#[serde(skip_serializing_if = "Option::is_none")]
12881260
side: Option<Side>,
1289-
#[serde(skip_serializing_if = "Option::is_none", rename = "xref")]
1261+
#[serde(rename = "xref")]
12901262
x_ref: Option<Reference>,
1291-
#[serde(skip_serializing_if = "Option::is_none", rename = "yref")]
1263+
#[serde(rename = "yref")]
12921264
y_ref: Option<Reference>,
1293-
#[serde(skip_serializing_if = "Option::is_none")]
12941265
x: Option<f64>,
1295-
#[serde(skip_serializing_if = "Option::is_none")]
12961266
y: Option<f64>,
1297-
#[serde(skip_serializing_if = "Option::is_none", rename = "xanchor")]
1267+
#[serde(rename = "xanchor")]
12981268
x_anchor: Option<Anchor>,
1299-
#[serde(skip_serializing_if = "Option::is_none", rename = "yanchor")]
1269+
#[serde(rename = "yanchor")]
13001270
y_anchor: Option<Anchor>,
1301-
#[serde(skip_serializing_if = "Option::is_none")]
13021271
pad: Option<Pad>,
13031272
}
13041273

@@ -1362,17 +1331,16 @@ impl Title {
13621331
}
13631332
}
13641333

1334+
#[serde_with::skip_serializing_none]
13651335
#[derive(Serialize, Clone, Debug, Default)]
13661336
pub struct Label {
1367-
#[serde(skip_serializing_if = "Option::is_none", rename = "bgcolor")]
1337+
#[serde(rename = "bgcolor")]
13681338
background_color: Option<Box<dyn Color>>,
1369-
#[serde(skip_serializing_if = "Option::is_none", rename = "bordercolor")]
1339+
#[serde(rename = "bordercolor")]
13701340
border_color: Option<Box<dyn Color>>,
1371-
#[serde(skip_serializing_if = "Option::is_none")]
13721341
font: Option<Font>,
1373-
#[serde(skip_serializing_if = "Option::is_none")]
13741342
align: Option<String>,
1375-
#[serde(skip_serializing_if = "Option::is_none", rename = "namelength")]
1343+
#[serde(rename = "namelength")]
13761344
name_length: Option<Dim<i32>>,
13771345
}
13781346

@@ -1428,32 +1396,25 @@ impl Default for ErrorType {
14281396
}
14291397
}
14301398

1399+
#[serde_with::skip_serializing_none]
14311400
#[derive(Serialize, Clone, Debug, Default)]
14321401
pub struct ErrorData {
14331402
r#type: ErrorType,
1434-
#[serde(skip_serializing_if = "Option::is_none")]
14351403
array: Option<Vec<f64>>,
1436-
#[serde(skip_serializing_if = "Option::is_none")]
14371404
visible: Option<bool>,
1438-
#[serde(skip_serializing_if = "Option::is_none")]
14391405
symmetric: Option<bool>,
1440-
#[serde(skip_serializing_if = "Option::is_none", rename = "arrayminus")]
1406+
#[serde(rename = "arrayminus")]
14411407
array_minus: Option<Vec<f64>>,
1442-
#[serde(skip_serializing_if = "Option::is_none")]
14431408
value: Option<f64>,
1444-
#[serde(skip_serializing_if = "Option::is_none", rename = "valueminus")]
1409+
#[serde(rename = "valueminus")]
14451410
value_minus: Option<f64>,
1446-
#[serde(skip_serializing_if = "Option::is_none", rename = "traceref")]
1411+
#[serde(rename = "traceref")]
14471412
trace_ref: Option<usize>,
1448-
#[serde(skip_serializing_if = "Option::is_none", rename = "tracerefminus")]
1413+
#[serde(rename = "tracerefminus")]
14491414
trace_ref_minus: Option<usize>,
1450-
#[serde(skip_serializing_if = "Option::is_none")]
14511415
copy_ystyle: Option<bool>,
1452-
#[serde(skip_serializing_if = "Option::is_none")]
14531416
color: Option<Box<dyn Color>>,
1454-
#[serde(skip_serializing_if = "Option::is_none")]
14551417
thickness: Option<f64>,
1456-
#[serde(skip_serializing_if = "Option::is_none")]
14571418
width: Option<usize>,
14581419
}
14591420

0 commit comments

Comments
 (0)