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 {}