Skip to main content

excelize_rs/xml/
decode_chart.rs

1//! Decode-only chart types.
2//!
3//! The serialize-oriented types in `crate::xml::chart` use namespace-prefixed
4//! element names (`c:barChart`, `a:solidFill`, etc.). `quick_xml`'s serde
5//! deserializer strips namespace prefixes from child elements, so these
6//! decode-only mirrors use unprefixed names for reading chart XML back.
7
8use serde::de::{Deserializer, MapAccess, SeqAccess, Visitor};
9use serde::{Deserialize, Serialize, Serializer};
10use std::fmt;
11
12use super::common::{AttrValBool, AttrValFloat, AttrValInt, AttrValString};
13
14/// Consumes any XML element/attribute content during deserialization.
15#[derive(Debug, Default, Clone, PartialEq, Eq)]
16pub struct DecodeIgnore;
17
18impl<'de> serde::de::Deserialize<'de> for DecodeIgnore {
19    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        struct IgnoreVisitor;
24
25        impl<'de> Visitor<'de> for IgnoreVisitor {
26            type Value = DecodeIgnore;
27
28            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
29                formatter.write_str("any XML content")
30            }
31
32            fn visit_bool<E>(self, _: bool) -> Result<Self::Value, E> {
33                Ok(DecodeIgnore)
34            }
35
36            fn visit_i64<E>(self, _: i64) -> Result<Self::Value, E> {
37                Ok(DecodeIgnore)
38            }
39
40            fn visit_u64<E>(self, _: u64) -> Result<Self::Value, E> {
41                Ok(DecodeIgnore)
42            }
43
44            fn visit_f64<E>(self, _: f64) -> Result<Self::Value, E> {
45                Ok(DecodeIgnore)
46            }
47
48            fn visit_str<E>(self, _: &str) -> Result<Self::Value, E> {
49                Ok(DecodeIgnore)
50            }
51
52            fn visit_string<E>(self, _: String) -> Result<Self::Value, E> {
53                Ok(DecodeIgnore)
54            }
55
56            fn visit_unit<E>(self) -> Result<Self::Value, E> {
57                Ok(DecodeIgnore)
58            }
59
60            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
61            where
62                A: SeqAccess<'de>,
63            {
64                while seq.next_element::<DecodeIgnore>()?.is_some() {}
65                Ok(DecodeIgnore)
66            }
67
68            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
69            where
70                A: MapAccess<'de>,
71            {
72                while map.next_entry::<DecodeIgnore, DecodeIgnore>()?.is_some() {}
73                Ok(DecodeIgnore)
74            }
75
76            fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
77            where
78                D: Deserializer<'de>,
79            {
80                DecodeIgnore::deserialize(deserializer)
81            }
82        }
83
84        deserializer.deserialize_any(IgnoreVisitor)
85    }
86}
87
88impl Serialize for DecodeIgnore {
89    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
90    where
91        S: Serializer,
92    {
93        serializer.serialize_unit_struct("DecodeIgnore")
94    }
95}
96
97/// Mirrors `XlsxChartSpace` for deserialization.
98#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
99#[serde(rename = "c:chartSpace")]
100pub struct DecodeChartSpace {
101    #[serde(rename = "chart", default)]
102    pub chart: DecodeCChart,
103    #[serde(rename = "spPr", default)]
104    pub sp_pr: Option<DecodeCSpPr>,
105}
106
107/// Mirrors `CChart` for deserialization.
108#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
109pub struct DecodeCChart {
110    #[serde(rename = "title", default)]
111    pub title: Option<DecodeCTitle>,
112    #[serde(rename = "plotArea", default)]
113    pub plot_area: Option<DecodeCPlotArea>,
114    #[serde(rename = "legend", default)]
115    pub legend: Option<DecodeCLegend>,
116    #[serde(rename = "dispBlanksAs", default)]
117    pub disp_blanks_as: Option<AttrValString>,
118}
119
120/// Mirrors `CPlotArea` for deserialization.
121#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
122pub struct DecodeCPlotArea {
123    #[serde(rename = "areaChart", default)]
124    pub area_chart: Vec<DecodeCCharts>,
125    #[serde(rename = "area3DChart", default)]
126    pub area_3d_chart: Vec<DecodeCCharts>,
127    #[serde(rename = "barChart", default)]
128    pub bar_chart: Vec<DecodeCCharts>,
129    #[serde(rename = "bar3DChart", default)]
130    pub bar_3d_chart: Vec<DecodeCCharts>,
131    #[serde(rename = "bubbleChart", default)]
132    pub bubble_chart: Vec<DecodeCCharts>,
133    #[serde(rename = "doughnutChart", default)]
134    pub doughnut_chart: Vec<DecodeCCharts>,
135    #[serde(rename = "lineChart", default)]
136    pub line_chart: Vec<DecodeCCharts>,
137    #[serde(rename = "line3DChart", default)]
138    pub line_3d_chart: Vec<DecodeCCharts>,
139    #[serde(rename = "ofPieChart", default)]
140    pub of_pie_chart: Vec<DecodeCCharts>,
141    #[serde(rename = "pieChart", default)]
142    pub pie_chart: Vec<DecodeCCharts>,
143    #[serde(rename = "pie3DChart", default)]
144    pub pie_3d_chart: Vec<DecodeCCharts>,
145    #[serde(rename = "radarChart", default)]
146    pub radar_chart: Vec<DecodeCCharts>,
147    #[serde(rename = "scatterChart", default)]
148    pub scatter_chart: Vec<DecodeCCharts>,
149    #[serde(rename = "stockChart", default)]
150    pub stock_chart: Vec<DecodeCCharts>,
151    #[serde(rename = "surfaceChart", default)]
152    pub surface_chart: Vec<DecodeCCharts>,
153    #[serde(rename = "surface3DChart", default)]
154    pub surface_3d_chart: Vec<DecodeCCharts>,
155    #[serde(rename = "catAx", default)]
156    pub cat_ax: Vec<DecodeCAxis>,
157    #[serde(rename = "valAx", default)]
158    pub val_ax: Vec<DecodeCAxis>,
159    #[serde(rename = "dateAx", default)]
160    pub date_ax: Vec<DecodeCAxis>,
161    #[serde(rename = "serAx", default)]
162    pub ser_ax: Vec<DecodeCAxis>,
163    #[serde(rename = "dTable", default)]
164    pub d_table: Option<DecodeCDTable>,
165    #[serde(rename = "layout", default)]
166    pub layout: Option<DecodeIgnore>,
167    #[serde(rename = "spPr", default)]
168    pub sp_pr: Option<DecodeCSpPr>,
169}
170
171/// Mirrors `CDTable` for deserialization.
172#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
173pub struct DecodeCDTable {
174    #[serde(rename = "showHorzBorder", default)]
175    pub show_horz_border: Option<AttrValBool>,
176    #[serde(rename = "showVertBorder", default)]
177    pub show_vert_border: Option<AttrValBool>,
178    #[serde(rename = "showOutline", default)]
179    pub show_outline: Option<AttrValBool>,
180    #[serde(rename = "showKeys", default)]
181    pub show_keys: Option<AttrValBool>,
182}
183
184/// Mirrors `CCharts` for deserialization.
185#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
186pub struct DecodeCCharts {
187    #[serde(rename = "barDir", default)]
188    pub bar_dir: Option<AttrValString>,
189    #[serde(rename = "grouping", default)]
190    pub grouping: Option<AttrValString>,
191    #[serde(rename = "scatterStyle", default)]
192    pub scatter_style: Option<AttrValString>,
193    #[serde(rename = "shape", default)]
194    pub shape: Option<AttrValString>,
195    #[serde(rename = "ofPieType", default)]
196    pub of_pie_type: Option<AttrValString>,
197    #[serde(rename = "wireframe", default)]
198    pub wireframe: Option<AttrValBool>,
199    #[serde(rename = "upDownBars", default)]
200    pub up_down_bars: Option<DecodeCUpDownBars>,
201    #[serde(rename = "varyColors", default)]
202    pub vary_colors: Option<AttrValBool>,
203    #[serde(rename = "ser", default)]
204    pub ser: Vec<DecodeCSer>,
205    #[serde(rename = "axId", default)]
206    pub ax_id: Vec<DecodeCAxId>,
207    #[serde(rename = "dLbls", default)]
208    pub d_lbls: Option<DecodeCDLbls>,
209    #[serde(rename = "gapWidth", default)]
210    pub gap_width: Option<AttrValInt>,
211    #[serde(rename = "holeSize", default)]
212    pub hole_size: Option<AttrValInt>,
213    #[serde(rename = "overlap", default)]
214    pub overlap: Option<AttrValInt>,
215    #[serde(rename = "splitPos", default)]
216    pub split_pos: Option<AttrValInt>,
217    #[serde(rename = "bubbleScale", default)]
218    pub bubble_scale: Option<AttrValFloat>,
219    #[serde(rename = "smooth", default)]
220    pub smooth: Option<AttrValBool>,
221}
222
223/// Mirrors `CUpDownBars` for deserialization.
224#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
225pub struct DecodeCUpDownBars {
226    #[serde(rename = "gapWidth", default)]
227    pub gap_width: Option<DecodeIgnore>,
228    #[serde(rename = "upBars", default)]
229    pub up_bars: Option<DecodeIgnore>,
230    #[serde(rename = "downBars", default)]
231    pub down_bars: Option<DecodeIgnore>,
232    #[serde(rename = "extLst", default)]
233    pub ext_lst: Option<DecodeIgnore>,
234}
235
236/// Mirrors `CSer` for deserialization.
237#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
238pub struct DecodeCSer {
239    #[serde(rename = "idx", default)]
240    pub idx: Option<AttrValInt>,
241    #[serde(rename = "order", default)]
242    pub order: Option<AttrValInt>,
243    #[serde(rename = "tx", default)]
244    pub tx: Option<DecodeCTx>,
245    #[serde(rename = "spPr", default)]
246    pub sp_pr: Option<DecodeCSpPr>,
247    #[serde(rename = "dPt", default)]
248    pub d_pt: Vec<DecodeCDPt>,
249    #[serde(rename = "dLbls", default)]
250    pub d_lbls: Option<DecodeCDLbls>,
251    #[serde(rename = "marker", default)]
252    pub marker: Option<DecodeCMarker>,
253    #[serde(rename = "cat", default)]
254    pub cat: Option<DecodeCCat>,
255    #[serde(rename = "val", default)]
256    pub val: Option<DecodeCVal>,
257    #[serde(rename = "xVal", default)]
258    pub x_val: Option<DecodeCCat>,
259    #[serde(rename = "yVal", default)]
260    pub y_val: Option<DecodeCVal>,
261    #[serde(rename = "bubbleSize", default)]
262    pub bubble_size: Option<DecodeCVal>,
263    #[serde(rename = "smooth", default)]
264    pub smooth: Option<AttrValBool>,
265}
266
267/// Mirrors `CTx` for deserialization.
268#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
269pub struct DecodeCTx {
270    #[serde(rename = "strRef", default)]
271    pub str_ref: Option<DecodeCStrRef>,
272}
273
274/// Mirrors `CStrRef` for deserialization.
275#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
276pub struct DecodeCStrRef {
277    #[serde(rename = "f", default)]
278    pub f: String,
279}
280
281/// Mirrors `CCat` for deserialization.
282#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
283pub struct DecodeCCat {
284    #[serde(rename = "strRef", default)]
285    pub str_ref: Option<DecodeCStrRef>,
286}
287
288/// Mirrors `CVal` for deserialization.
289#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
290pub struct DecodeCVal {
291    #[serde(rename = "numRef", default)]
292    pub num_ref: Option<DecodeCNumRef>,
293}
294
295/// Mirrors `CNumRef` for deserialization.
296#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
297pub struct DecodeCNumRef {
298    #[serde(rename = "f", default)]
299    pub f: String,
300}
301
302/// Mirrors `CMarker` for deserialization.
303#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
304pub struct DecodeCMarker {
305    #[serde(rename = "symbol", default)]
306    pub symbol: Option<AttrValString>,
307    #[serde(rename = "size", default)]
308    pub size: Option<AttrValInt>,
309    #[serde(rename = "spPr", default)]
310    pub sp_pr: Option<DecodeCSpPr>,
311}
312
313/// Mirrors `CDPt` for deserialization.
314#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
315pub struct DecodeCDPt {
316    #[serde(rename = "idx", default)]
317    pub idx: Option<AttrValInt>,
318    #[serde(rename = "spPr", default)]
319    pub sp_pr: Option<DecodeCSpPr>,
320}
321
322/// Mirrors `CDLbls` for deserialization.
323#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
324pub struct DecodeCDLbls {
325    #[serde(rename = "dLblPos", default)]
326    pub d_lbl_pos: Option<AttrValString>,
327    #[serde(rename = "numFmt", default)]
328    pub num_fmt: Option<DecodeCNumFmt>,
329    #[serde(rename = "spPr", default)]
330    pub sp_pr: Option<DecodeCSpPr>,
331    #[serde(rename = "txPr", default)]
332    pub tx_pr: Option<DecodeCTxPr>,
333    #[serde(rename = "showLegendKey", default)]
334    pub show_legend_key: Option<AttrValBool>,
335    #[serde(rename = "showVal", default)]
336    pub show_val: Option<AttrValBool>,
337    #[serde(rename = "showCatName", default)]
338    pub show_cat_name: Option<AttrValBool>,
339    #[serde(rename = "showSerName", default)]
340    pub show_ser_name: Option<AttrValBool>,
341    #[serde(rename = "showPercent", default)]
342    pub show_percent: Option<AttrValBool>,
343    #[serde(rename = "showBubbleSize", default)]
344    pub show_bubble_size: Option<AttrValBool>,
345    #[serde(rename = "showLeaderLines", default)]
346    pub show_leader_lines: Option<AttrValBool>,
347}
348
349/// Mirrors `CSpPr` for deserialization.
350#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
351pub struct DecodeCSpPr {
352    #[serde(rename = "noFill", default)]
353    pub no_fill: Option<String>,
354    #[serde(rename = "solidFill", default)]
355    pub solid_fill: Option<DecodeASolidFill>,
356    #[serde(rename = "gradFill", default)]
357    pub grad_fill: Option<DecodeIgnore>,
358    #[serde(rename = "pattFill", default)]
359    pub patt_fill: Option<DecodeIgnore>,
360    #[serde(rename = "ln", default)]
361    pub ln: Option<DecodeALn>,
362    #[serde(rename = "sp3d", default)]
363    pub sp3d: Option<DecodeIgnore>,
364    #[serde(rename = "effectLst", default)]
365    pub effect_lst: Option<DecodeIgnore>,
366    #[serde(rename = "extLst", default)]
367    pub ext_lst: Option<DecodeIgnore>,
368}
369
370/// Mirrors `ASolidFill` for deserialization.
371#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
372pub struct DecodeASolidFill {
373    #[serde(rename = "srgbClr", default)]
374    pub srgb_clr: Option<DecodeASrgbClr>,
375    #[serde(rename = "schemeClr", default)]
376    pub scheme_clr: Option<DecodeASchemeClr>,
377    #[serde(rename = "prstClr", default)]
378    pub prst_clr: Option<DecodeIgnore>,
379    #[serde(rename = "sysClr", default)]
380    pub sys_clr: Option<DecodeIgnore>,
381    #[serde(rename = "hslClr", default)]
382    pub hsl_clr: Option<DecodeIgnore>,
383    #[serde(rename = "scrgbClr", default)]
384    pub scrgb_clr: Option<DecodeIgnore>,
385}
386
387/// Mirrors `ASrgbClr` for deserialization.
388#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
389pub struct DecodeASrgbClr {
390    #[serde(rename = "@val", default)]
391    pub val: Option<String>,
392    #[serde(rename = "lumMod", default)]
393    pub lum_mod: Option<AttrValInt>,
394    #[serde(rename = "lumOff", default)]
395    pub lum_off: Option<AttrValInt>,
396}
397
398/// Mirrors `ASchemeClr` for deserialization.
399#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
400pub struct DecodeASchemeClr {
401    #[serde(rename = "@val", default)]
402    pub val: Option<String>,
403    #[serde(rename = "lumMod", default)]
404    pub lum_mod: Option<AttrValInt>,
405    #[serde(rename = "lumOff", default)]
406    pub lum_off: Option<AttrValInt>,
407}
408
409/// Mirrors `ALn` for deserialization.
410#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
411pub struct DecodeALn {
412    #[serde(rename = "@w", default)]
413    pub w: Option<String>,
414    #[serde(rename = "noFill", default)]
415    pub no_fill: Option<String>,
416    #[serde(rename = "solidFill", default)]
417    pub solid_fill: Option<DecodeASolidFill>,
418    #[serde(rename = "gradFill", default)]
419    pub grad_fill: Option<DecodeIgnore>,
420    #[serde(rename = "pattFill", default)]
421    pub patt_fill: Option<DecodeIgnore>,
422    #[serde(rename = "round", default)]
423    pub round: Option<DecodeIgnore>,
424    #[serde(rename = "bevel", default)]
425    pub bevel: Option<DecodeIgnore>,
426    #[serde(rename = "miter", default)]
427    pub miter: Option<DecodeIgnore>,
428    #[serde(rename = "prstDash", default)]
429    pub prst_dash: Option<AttrValString>,
430    #[serde(rename = "custDash", default)]
431    pub cust_dash: Option<DecodeIgnore>,
432    #[serde(rename = "headEnd", default)]
433    pub head_end: Option<DecodeIgnore>,
434    #[serde(rename = "tailEnd", default)]
435    pub tail_end: Option<DecodeIgnore>,
436    #[serde(rename = "extLst", default)]
437    pub ext_lst: Option<DecodeIgnore>,
438}
439
440/// Mirrors `CAxId` for deserialization.
441#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
442pub struct DecodeCAxId {
443    #[serde(rename = "@val", default)]
444    pub val: i64,
445}
446
447/// Mirrors a generic chart axis (`c:catAx`, `c:valAx`, `c:dateAx`, `c:serAx`).
448#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
449pub struct DecodeCAxis {
450    #[serde(rename = "axId", default)]
451    pub ax_id: Option<AttrValInt>,
452    #[serde(rename = "scaling", default)]
453    pub scaling: Option<DecodeCScaling>,
454    #[serde(rename = "delete", default)]
455    pub delete: Option<AttrValBool>,
456    #[serde(rename = "axPos", default)]
457    pub ax_pos: Option<AttrValString>,
458    #[serde(rename = "majorGridlines", default)]
459    pub major_grid_lines: Option<DecodeIgnore>,
460    #[serde(rename = "minorGridlines", default)]
461    pub minor_grid_lines: Option<DecodeIgnore>,
462    #[serde(rename = "title", default)]
463    pub title: Option<DecodeCTitle>,
464    #[serde(rename = "numFmt", default)]
465    pub num_fmt: Option<DecodeCNumFmt>,
466    #[serde(rename = "majorTickMark", default)]
467    pub major_tick_mark: Option<AttrValString>,
468    #[serde(rename = "minorTickMark", default)]
469    pub minor_tick_mark: Option<AttrValString>,
470    #[serde(rename = "tickLblPos", default)]
471    pub tick_lbl_pos: Option<AttrValString>,
472    #[serde(rename = "tickLblSkip", default)]
473    pub tick_lbl_skip: Option<AttrValInt>,
474    #[serde(rename = "crossAx", default)]
475    pub cross_ax: Option<AttrValInt>,
476    #[serde(rename = "crosses", default)]
477    pub crosses: Option<AttrValString>,
478    #[serde(rename = "crossBetween", default)]
479    pub cross_between: Option<AttrValString>,
480    #[serde(rename = "auto", default)]
481    pub auto: Option<AttrValBool>,
482    #[serde(rename = "lblOffset", default)]
483    pub lbl_offset: Option<AttrValInt>,
484    #[serde(rename = "majorUnit", default)]
485    pub major_unit: Option<AttrValFloat>,
486    #[serde(rename = "minorUnit", default)]
487    pub minor_unit: Option<AttrValFloat>,
488    #[serde(rename = "spPr", default)]
489    pub sp_pr: Option<DecodeIgnore>,
490    #[serde(rename = "txPr", default)]
491    pub tx_pr: Option<DecodeIgnore>,
492    #[serde(rename = "extLst", default)]
493    pub ext_lst: Option<DecodeIgnore>,
494}
495
496/// Mirrors `CScaling` for deserialization.
497#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
498pub struct DecodeCScaling {
499    #[serde(rename = "orientation", default)]
500    pub orientation: Option<AttrValString>,
501    #[serde(rename = "max", default)]
502    pub max: Option<AttrValFloat>,
503    #[serde(rename = "min", default)]
504    pub min: Option<AttrValFloat>,
505    #[serde(rename = "logBase", default)]
506    pub log_base: Option<AttrValFloat>,
507}
508
509/// Mirrors `CNumFmt` for deserialization.
510#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
511pub struct DecodeCNumFmt {
512    #[serde(rename = "@formatCode", default)]
513    pub format_code: String,
514    #[serde(rename = "@sourceLinked", default)]
515    pub source_linked: bool,
516}
517
518/// Mirrors `CTitle` for deserialization.
519#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
520pub struct DecodeCTitle {
521    #[serde(rename = "tx", default)]
522    pub tx: Option<DecodeCTitleTx>,
523    #[serde(rename = "overlay", default)]
524    pub overlay: Option<AttrValBool>,
525    #[serde(rename = "layout", default)]
526    pub layout: Option<DecodeIgnore>,
527    #[serde(rename = "spPr", default)]
528    pub sp_pr: Option<DecodeCSpPr>,
529    #[serde(rename = "txPr", default)]
530    pub tx_pr: Option<DecodeCTxPr>,
531    #[serde(rename = "extLst", default)]
532    pub ext_lst: Option<DecodeIgnore>,
533}
534
535/// Mirrors `CLegend` for deserialization.
536#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
537pub struct DecodeCLegend {
538    #[serde(rename = "legendPos", default)]
539    pub legend_pos: Option<AttrValString>,
540    #[serde(rename = "overlay", default)]
541    pub overlay: Option<AttrValBool>,
542    #[serde(rename = "layout", default)]
543    pub layout: Option<DecodeIgnore>,
544    #[serde(rename = "txPr", default)]
545    pub tx_pr: Option<DecodeCTxPr>,
546    #[serde(rename = "spPr", default)]
547    pub sp_pr: Option<DecodeIgnore>,
548    #[serde(rename = "legendEntry", default)]
549    pub legend_entry: Vec<DecodeIgnore>,
550    #[serde(rename = "extLst", default)]
551    pub ext_lst: Option<DecodeIgnore>,
552}
553
554/// Mirrors `CTxPr` for deserialization.
555#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
556pub struct DecodeCTxPr {
557    #[serde(rename = "bodyPr", default)]
558    pub body_pr: Option<DecodeIgnore>,
559    #[serde(rename = "lstStyle", default)]
560    pub lst_style: Option<DecodeIgnore>,
561    #[serde(rename = "p", default)]
562    pub p: Option<DecodeAP>,
563}
564
565/// Mirrors `AP` for deserialization.
566#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
567pub struct DecodeAP {
568    #[serde(rename = "pPr", default)]
569    pub p_pr: Option<DecodeAPPr>,
570    #[serde(rename = "r", default)]
571    pub r: Vec<DecodeCR>,
572    #[serde(rename = "t", default)]
573    pub t: Option<String>,
574    #[serde(rename = "endParaRPr", default)]
575    pub end_para_r_pr: Option<DecodeIgnore>,
576}
577
578/// Mirrors `APPr` for deserialization.
579#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
580pub struct DecodeAPPr {
581    #[serde(rename = "defRPr", default)]
582    pub def_r_pr: Option<DecodeARPr>,
583}
584
585/// Mirrors `ARPr` for deserialization.
586#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
587pub struct DecodeARPr {
588    #[serde(rename = "@sz", default)]
589    pub sz: Option<String>,
590    #[serde(rename = "@b", default)]
591    pub b: Option<String>,
592    #[serde(rename = "@i", default)]
593    pub i: Option<String>,
594    #[serde(rename = "@strike", default)]
595    pub strike: Option<String>,
596    #[serde(rename = "@u", default)]
597    pub u: Option<String>,
598    #[serde(rename = "@vertAlign", default)]
599    pub vert_align: Option<String>,
600    #[serde(rename = "solidFill", default)]
601    pub solid_fill: Option<DecodeASolidFill>,
602    #[serde(rename = "latin", default)]
603    pub latin: Option<DecodeALatin>,
604    #[serde(rename = "ea", default)]
605    pub ea: Option<DecodeALatin>,
606    #[serde(rename = "cs", default)]
607    pub cs: Option<DecodeALatin>,
608}
609
610/// Mirrors `ALatin` for deserialization.
611#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
612pub struct DecodeALatin {
613    #[serde(rename = "@typeface", default)]
614    pub typeface: Option<String>,
615}
616
617/// Mirrors the `c:tx` child of a chart title for deserialization.
618#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
619pub struct DecodeCTitleTx {
620    #[serde(rename = "strRef", default)]
621    pub str_ref: Option<DecodeCStrRef>,
622    #[serde(rename = "rich", default)]
623    pub rich: Option<DecodeCRich>,
624}
625
626/// Mirrors `CRich` for deserialization.
627#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
628pub struct DecodeCRich {
629    #[serde(rename = "bodyPr", default)]
630    pub body_pr: Option<DecodeIgnore>,
631    #[serde(rename = "lstStyle", default)]
632    pub lst_style: Option<DecodeIgnore>,
633    #[serde(rename = "p", default)]
634    pub p: Vec<DecodeAP>,
635}
636
637/// Mirrors a rich-text run for deserialization.
638#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
639pub struct DecodeCR {
640    #[serde(rename = "rPr", default)]
641    pub r_pr: Option<DecodeARPr>,
642    #[serde(rename = "t", default)]
643    pub t: Option<String>,
644}