1use bon::{builder, Builder};
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9
10#[derive(Clone, Debug, Default, Deserialize, Serialize)]
14#[serde(rename_all = "camelCase")]
15pub enum Capitalization {
16    #[default]
18    #[serde(rename = "none")]
19    NoCap,
20    All,
22    Small,
24}
25#[skip_serializing_none]
27#[derive(Clone, Debug, Deserialize, Serialize)]
28#[serde(rename_all = "camelCase")]
29pub enum Effect {
30    #[serde(rename(serialize = "a:blur", deserialize = "blur"))]
32    Blur {
33        #[serde(rename = "@rad")]
35        radius: Option<String>,
36        #[serde(rename = "@grow")]
38        grow_bounds: Option<String>,
39    },
40    #[serde(rename(serialize = "a:glow", deserialize = "glow"))]
42    Glow,
43    #[serde(rename(serialize = "a:reflection", deserialize = "reflection"))]
45    Reflection,
46}
47#[derive(Clone, Debug, Default, Deserialize, Serialize)]
51#[serde(rename_all = "camelCase")]
52pub enum LineFill {
53    #[default]
55    #[serde(rename(serialize = "a:noFill", deserialize = "noFill"))]
56    NoFill,
57    #[serde(rename(serialize = "a:solidFill", deserialize = "solidFill"))]
59    Solid,
60    #[serde(rename(serialize = "a:gradFill", deserialize = "gradFill"))]
62    Gradient,
63    #[serde(rename(serialize = "a:pattFill", deserialize = "pattFill"))]
65    Pattern,
66}
67#[derive(Clone, Debug, Default, Deserialize, Serialize)]
71#[serde(rename_all = "camelCase")]
72pub enum Strikethrough {
73    #[default]
75    #[serde(rename = "noStrike")]
76    NoStrike,
77    #[serde(rename = "sngStrike")]
79    Single,
80    #[serde(rename = "dblStrike")]
82    Double,
83}
84#[derive(Clone, Debug, Deserialize, Serialize)]
88#[serde(rename_all = "camelCase")]
89pub enum TextUnderline {
90    #[serde(rename(serialize = "a:uLnTx", deserialize = "uLnTx"))]
92    FollowsText,
93    #[serde(rename(serialize = "a:uLn", deserialize = "uLn"))]
95    Stroke,
96}
97#[derive(Clone, Debug, Deserialize, Serialize)]
101pub struct BulletCharacter {
102    #[serde(rename = "@char")]
104    pub character: String,
105}
106#[derive(Clone, Debug, Deserialize, Serialize)]
110pub struct BulletColor {
111    #[serde(rename(serialize = "a:srgbClr", deserialize = "srgbClr"))]
115    pub color: Color,
116}
117#[derive(Clone, Debug, Deserialize, Serialize)]
121#[serde(rename_all = "camelCase")]
122pub struct BulletFont {
123    #[serde(rename = "@typeface")]
125    pub typeface: String,
126    #[serde(rename = "@panose")]
130    pub panose: String,
131    #[serde(rename = "@pitchFamily")]
133    pub similar_font_family: String,
134    #[serde(rename = "@charset")]
136    pub charset: String,
137}
138#[derive(Clone, Debug, Deserialize, Serialize)]
142pub struct Color {
143    #[serde(rename = "@val")]
145    pub value: String,
146}
147#[skip_serializing_none]
151#[derive(Clone, Debug, Deserialize, Serialize)]
152#[serde(rename_all = "camelCase")]
153pub struct EffectContainer {
154    #[serde(rename = "$value")]
156    pub effect: Option<Vec<Effect>>,
157}
158#[derive(Clone, Debug, Deserialize, Serialize)]
162pub struct FontComplexScript {
163    #[serde(rename = "@typeface")]
165    pub typeface: String,
166}
167#[derive(Clone, Debug, Deserialize, Serialize)]
171pub struct FontEastAsian {
172    #[serde(rename = "@typeface")]
174    pub typeface: String,
175}
176#[derive(Clone, Debug, Deserialize, Serialize)]
180pub struct FontSymbol {
181    #[serde(rename = "@typeface")]
183    pub typeface: String,
184}
185#[skip_serializing_none]
189#[derive(Clone, Debug, Deserialize, Serialize)]
190pub struct Line {
191    #[serde(rename = "$value")]
192    line_fill: LineFill,
193}
194#[derive(Clone, Debug, Deserialize, Serialize)]
196#[serde(rename_all = "PascalCase")]
197pub struct Relationships {
198    pub relationship: Vec<Relationship>,
200}
201#[derive(Clone, Debug, Deserialize, Serialize)]
205#[serde(rename_all = "PascalCase")]
206pub struct Relationship {
207    #[serde(rename = "@Id")]
209    pub id: String,
210    #[serde(rename = "@Type")]
212    pub relationship_type: String,
213    #[serde(rename = "@Target")]
215    pub target: String,
216    #[serde(rename = "@TargetMode")]
218    pub target_mode: Option<String>,
219}
220#[skip_serializing_none]
224#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
225#[builder(start_fn = init)]
226pub struct TextCharacterProperties {
227    #[serde(rename = "@baseline")]
229    pub baseline: Option<String>,
230    #[serde(rename = "@b")]
232    pub bold: Option<String>,
233    #[serde(rename = "@cap")]
235    pub capitalization: Option<Capitalization>,
236    #[builder(default = "0".to_string())]
238    #[serde(rename = "@dirty")]
239    pub dirty: String,
240    #[serde(rename = "@i")]
242    pub italic: Option<String>,
243    #[builder(default = "0".to_string())]
245    #[serde(rename = "@kern")]
246    pub kerning: String,
247    #[serde(rename = "@kumimoji")]
249    pub kumimoji: Option<String>,
250    #[serde(rename = "@lang")]
252    pub language: Option<String>,
253    #[serde(rename = "@noProof")]
255    pub no_proofing: Option<String>,
256    #[serde(rename = "@normalizeH")]
258    pub normalize_heights: Option<String>,
259    #[serde(rename = "@spc")]
261    pub spacing: Option<String>,
262    #[serde(rename = "@sz")]
264    pub size: Option<String>,
265    #[serde(rename = "@strike")]
267    pub strikethrough: Option<Strikethrough>,
268    #[serde(rename = "@u")]
270    pub underline: Option<String>,
271    #[serde(rename(serialize = "a:ln", deserialize = "ln"))]
275    pub line: Option<Line>,
276    #[serde(rename(serialize = "a:effectlst", deserialize = "effectLst"))]
278    pub effect_list: Option<EffectContainer>,
279    #[serde(rename(serialize = "a:uLnTx", deserialize = "uLnTx"))]
281    pub underline_follows_text: Option<UnderlineFollowsText>,
282    #[serde(rename(serialize = "a:uLn", deserialize = "uLn"))]
284    pub underline_stroke: Option<UnderlineStroke>,
285    #[serde(rename(serialize = "a:uFillTx", deserialize = "uFillTx"))]
287    pub underline_fill_properties_follow_text: Option<UnderlineFillPropertiesFollowText>,
288    #[serde(rename(serialize = "a:uFill", deserialize = "uFill"))]
290    pub underline_fill: Option<UnderlineFill>,
291    #[serde(rename(serialize = "a:cs", deserialize = "cs"))]
293    pub font_complex_script: Option<FontComplexScript>,
294    #[serde(rename(serialize = "a:ea", deserialize = "ea"))]
296    pub font_east_asian: Option<FontEastAsian>,
297    #[serde(rename(serialize = "a:sym", deserialize = "sym"))]
299    pub font_symbol: Option<FontSymbol>,
300}
301#[skip_serializing_none]
305#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
306#[builder(start_fn = init)]
307#[serde(rename = "a:p")]
308pub struct TextParagraph {
309    #[builder(default = Vec::new())]
311    #[serde(rename(serialize = "a:pPr", deserialize = "pPr"))]
312    pub text_paragraph_properties: Vec<TextParagraphProperties>,
313    #[builder(default = Vec::new())]
315    #[serde(rename(serialize = "a:r", deserialize = "r"))]
316    pub text_run: Vec<TextRun>,
317    #[serde(rename(serialize = "a:endParaRPr", deserialize = "endParaRPr"))]
321    pub end_paragraph_run_properties: Option<TextCharacterProperties>,
322}
323#[skip_serializing_none]
327#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
328#[builder(start_fn = init)]
329pub struct TextParagraphProperties {
330    #[serde(rename = "@indent")]
332    #[builder(default = "0".to_string())]
333    pub indent: String,
334    #[serde(rename = "@marL")]
336    #[builder(default = "0".to_string())]
337    pub margin_left: String,
338    #[serde(rename(serialize = "a:buClr", deserialize = "buClr"))]
340    pub bullet_color: Option<BulletColor>,
341    #[serde(rename(serialize = "a:buFont", deserialize = "buFont"))]
343    pub bullet_font: Option<BulletFont>,
344    #[serde(rename(serialize = "a:buChar", deserialize = "buChar"))]
346    pub bullet_character: Option<BulletCharacter>,
347    #[serde(rename(serialize = "a:defRPr", deserialize = "defRPr"))]
349    pub default_text_run_properties: Option<TextRunPropertiesDefault>,
350}
351#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
355#[builder(start_fn = init)]
356pub struct TextRun {
357    #[builder(default = Vec::new())]
359    #[serde(rename(serialize = "a:rPr", deserialize = "rPr"))]
360    pub text_run_properties: Vec<TextCharacterProperties>,
361    #[builder(default = TextString::init().build())]
363    #[serde(rename(serialize = "a:t", deserialize = "t"))]
364    pub text: TextString,
365}
366#[derive(Clone, Debug, Deserialize, Serialize)]
370pub struct TextRunPropertiesDefault {}
371#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
375#[builder(start_fn = init)]
376pub struct TextString {
377    #[builder(default = "".to_string())]
379    #[serde(rename = "$text")]
380    pub value: String,
381}
382#[derive(Clone, Debug, Deserialize, Serialize)]
386pub struct UnderlineFill {}
387#[derive(Clone, Debug, Deserialize, Serialize)]
391pub struct UnderlineFillPropertiesFollowText {}
392#[derive(Clone, Debug, Deserialize, Serialize)]
396pub struct UnderlineFollowsText {}
397#[derive(Clone, Debug, Deserialize, Serialize)]
401pub struct UnderlineStroke {}