1use crate::ColorValue;
2use serde::{Deserialize, Serialize};
3use std::collections::BTreeMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(untagged)]
8pub enum AnimationNumber {
9 Number(f64),
10 Indefinite(AnimationIndefinite),
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(rename_all = "lowercase")]
15pub enum AnimationIndefinite {
16 Indefinite,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(tag = "kind", content = "value", rename_all = "camelCase")]
21pub enum AnimationValue {
22 String(String),
23 Boolean(bool),
24 Integer(i32),
25 Number(f64),
26 Color(ColorValue),
27 Point(AnimationPoint),
28 RgbDelta([f64; 3]),
29 HslDelta([f64; 3]),
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct SlideTransition {
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub effect: Option<TransitionEffect>,
37 pub speed: String,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub duration_ms: Option<u32>,
40 pub advance_on_click: bool,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub advance_after_ms: Option<u32>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub sound: Option<TransitionSound>,
45 pub source_xml: String,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct TransitionEffect {
51 pub kind: String,
52 pub namespace: String,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub direction: Option<String>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub orientation: Option<String>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub through_black: Option<bool>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub spokes: Option<u32>,
61 pub parameters: BTreeMap<String, String>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase")]
66pub struct TransitionSound {
67 pub action: String,
68 pub loop_sound: bool,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub source: Option<AnimationSound>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct AnimationSound {
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub relationship_id: Option<String>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub target: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub asset_id: Option<String>,
82 pub external: bool,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub name: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub builtin: Option<bool>,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct SlideTiming {
92 #[serde(default, skip_serializing_if = "Vec::is_empty")]
93 pub nodes: Vec<AnimationNode>,
94 #[serde(default, skip_serializing_if = "Vec::is_empty")]
95 pub builds: Vec<AnimationBuild>,
96 #[serde(default, skip_serializing_if = "Vec::is_empty")]
97 pub unsupported: Vec<String>,
98 pub source_xml: String,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct AnimationNode {
104 pub kind: String,
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub time: Option<Box<AnimationTime>>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub behavior: Option<AnimationBehavior>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub sequence: Option<AnimationSequence>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub media: Option<AnimationMedia>,
113 pub parameters: AnimationParameters,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct AnimationTime {
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub id: Option<u32>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub preset_id: Option<i32>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub preset_class: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub preset_subtype: Option<i32>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub duration_ms: Option<AnimationNumber>,
129 pub repeat_count: AnimationNumber,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub repeat_duration_ms: Option<AnimationNumber>,
132 pub speed: f64,
133 pub acceleration: f64,
134 pub deceleration: f64,
135 pub auto_reverse: bool,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub restart: Option<String>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub fill: Option<String>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub sync_behavior: Option<String>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub time_filter: Option<String>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub event_filter: Option<String>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub display: Option<bool>,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub master_relation: Option<String>,
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub build_level: Option<i32>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub group_id: Option<u32>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub after_effect: Option<bool>,
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub node_type: Option<String>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub placeholder: Option<bool>,
160 #[serde(default, skip_serializing_if = "Vec::is_empty")]
161 pub start_conditions: Vec<AnimationCondition>,
162 #[serde(default, skip_serializing_if = "Vec::is_empty")]
163 pub end_conditions: Vec<AnimationCondition>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub end_sync: Option<AnimationCondition>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub iterate: Option<AnimationIteration>,
168 #[serde(default, skip_serializing_if = "Vec::is_empty")]
169 pub children: Vec<AnimationNode>,
170 #[serde(default, skip_serializing_if = "Vec::is_empty")]
171 pub sub_nodes: Vec<AnimationNode>,
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
175#[serde(rename_all = "camelCase")]
176pub struct AnimationCondition {
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub event: Option<String>,
179 #[serde(skip_serializing_if = "Option::is_none")]
180 pub delay_ms: Option<AnimationNumber>,
181 #[serde(skip_serializing_if = "Option::is_none")]
182 pub target: Option<AnimationTarget>,
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub time_node_id: Option<u32>,
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub runtime_node: Option<String>,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
190#[serde(rename_all = "camelCase")]
191pub struct AnimationIteration {
192 pub kind: String,
193 pub backwards: bool,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub interval_ms: Option<AnimationNumber>,
196 #[serde(skip_serializing_if = "Option::is_none")]
197 pub interval_fraction: Option<f64>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
201#[serde(rename_all = "camelCase")]
202pub struct AnimationTarget {
203 pub kind: String,
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub shape_id: Option<String>,
207 #[serde(skip_serializing_if = "Option::is_none")]
208 pub sub_shape_id: Option<String>,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 pub background: Option<bool>,
211 #[serde(skip_serializing_if = "Option::is_none")]
212 pub text: Option<AnimationTextRange>,
213 #[serde(skip_serializing_if = "Option::is_none")]
214 pub chart: Option<AnimationChartTarget>,
215 #[serde(skip_serializing_if = "Option::is_none")]
216 pub diagram: Option<AnimationDiagramTarget>,
217 #[serde(skip_serializing_if = "Option::is_none")]
218 pub sound: Option<AnimationSound>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct AnimationTextRange {
224 pub kind: String,
225 #[serde(skip_serializing_if = "Option::is_none")]
226 pub start: Option<u32>,
227 #[serde(skip_serializing_if = "Option::is_none")]
228 pub end: Option<u32>,
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase")]
233pub struct AnimationChartTarget {
234 pub kind: String,
235 #[serde(skip_serializing_if = "Option::is_none")]
236 pub level: Option<u32>,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub series_index: Option<i32>,
239 #[serde(skip_serializing_if = "Option::is_none")]
240 pub category_index: Option<i32>,
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
244#[serde(rename_all = "camelCase")]
245pub struct AnimationDiagramTarget {
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub id: Option<String>,
248 #[serde(skip_serializing_if = "Option::is_none")]
249 pub build_step: Option<String>,
250}
251
252#[derive(Debug, Clone, Serialize, Deserialize)]
253#[serde(rename_all = "camelCase")]
254pub struct AnimationBehavior {
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub target: Option<AnimationTarget>,
257 #[serde(default, skip_serializing_if = "Vec::is_empty")]
258 pub attribute_names: Vec<String>,
259 #[serde(skip_serializing_if = "Option::is_none")]
260 pub additive: Option<String>,
261 #[serde(skip_serializing_if = "Option::is_none")]
262 pub accumulate: Option<String>,
263 #[serde(skip_serializing_if = "Option::is_none")]
264 pub transform_type: Option<String>,
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub from: Option<String>,
267 #[serde(skip_serializing_if = "Option::is_none")]
268 pub to: Option<String>,
269 #[serde(skip_serializing_if = "Option::is_none")]
270 pub by: Option<String>,
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub runtime_context: Option<String>,
273 #[serde(skip_serializing_if = "Option::is_none")]
274 pub override_mode: Option<String>,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
278#[serde(rename_all = "camelCase")]
279pub struct AnimationSequence {
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub concurrent: Option<bool>,
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub previous_action: Option<String>,
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub next_action: Option<String>,
286 #[serde(default, skip_serializing_if = "Vec::is_empty")]
287 pub previous_conditions: Vec<AnimationCondition>,
288 #[serde(default, skip_serializing_if = "Vec::is_empty")]
289 pub next_conditions: Vec<AnimationCondition>,
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize)]
293#[serde(rename_all = "camelCase")]
294pub struct AnimationMedia {
295 #[serde(skip_serializing_if = "Option::is_none")]
296 pub target: Option<AnimationTarget>,
297 pub volume: f64,
298 pub mute: bool,
299 pub slide_count: u32,
300 pub show_when_stopped: bool,
301 #[serde(skip_serializing_if = "Option::is_none")]
302 pub narration: Option<bool>,
303 #[serde(skip_serializing_if = "Option::is_none")]
304 pub full_screen: Option<bool>,
305}
306
307#[derive(Debug, Clone, Default, Serialize, Deserialize)]
308#[serde(rename_all = "camelCase")]
309pub struct AnimationParameters {
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub from: Option<AnimationValue>,
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub to: Option<AnimationValue>,
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub by: Option<AnimationValue>,
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub calculation_mode: Option<String>,
318 #[serde(skip_serializing_if = "Option::is_none")]
319 pub value_type: Option<String>,
320 #[serde(default, skip_serializing_if = "Vec::is_empty")]
321 pub keyframes: Vec<AnimationKeyframe>,
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub color_space: Option<String>,
324 #[serde(skip_serializing_if = "Option::is_none")]
325 pub direction: Option<String>,
326 #[serde(skip_serializing_if = "Option::is_none")]
327 pub transition: Option<String>,
328 #[serde(skip_serializing_if = "Option::is_none")]
329 pub filter: Option<String>,
330 #[serde(skip_serializing_if = "Option::is_none")]
331 pub properties: Option<String>,
332 #[serde(skip_serializing_if = "Option::is_none")]
333 pub progress: Option<AnimationValue>,
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub origin: Option<String>,
336 #[serde(skip_serializing_if = "Option::is_none")]
337 pub path: Option<String>,
338 #[serde(skip_serializing_if = "Option::is_none")]
339 pub path_edit_mode: Option<String>,
340 #[serde(skip_serializing_if = "Option::is_none")]
341 pub rotation_center: Option<AnimationPoint>,
342 #[serde(skip_serializing_if = "Option::is_none")]
343 pub rotation_degrees: Option<f64>,
344 #[serde(skip_serializing_if = "Option::is_none")]
345 pub point_types: Option<String>,
346 #[serde(skip_serializing_if = "Option::is_none")]
347 pub zoom_contents: Option<bool>,
348 #[serde(skip_serializing_if = "Option::is_none")]
349 pub command_type: Option<String>,
350 #[serde(skip_serializing_if = "Option::is_none")]
351 pub command: Option<String>,
352}
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
355#[serde(rename_all = "camelCase")]
356pub struct AnimationPoint {
357 pub x: f64,
358 pub y: f64,
359}
360
361#[derive(Debug, Clone, Serialize, Deserialize)]
362#[serde(rename_all = "camelCase")]
363pub struct AnimationKeyframe {
364 pub time: AnimationNumber,
365 pub formula: String,
366 #[serde(skip_serializing_if = "Option::is_none")]
367 pub value: Option<AnimationValue>,
368}
369
370#[derive(Debug, Clone, Serialize, Deserialize)]
371#[serde(rename_all = "camelCase")]
372pub struct AnimationBuild {
373 pub kind: String,
374 #[serde(skip_serializing_if = "Option::is_none")]
375 pub shape_id: Option<String>,
377 #[serde(skip_serializing_if = "Option::is_none")]
378 pub group_id: Option<u32>,
379 pub ui_expand: bool,
380 #[serde(skip_serializing_if = "Option::is_none")]
381 pub build: Option<String>,
382 #[serde(skip_serializing_if = "Option::is_none")]
383 pub level: Option<u32>,
384 #[serde(skip_serializing_if = "Option::is_none")]
385 pub animate_background: Option<bool>,
386 #[serde(skip_serializing_if = "Option::is_none")]
387 pub auto_update_background: Option<bool>,
388 #[serde(skip_serializing_if = "Option::is_none")]
389 pub reverse: Option<bool>,
390 #[serde(skip_serializing_if = "Option::is_none")]
391 pub advance_after_ms: Option<AnimationNumber>,
392 #[serde(skip_serializing_if = "Option::is_none")]
393 pub as_one: Option<bool>,
394 #[serde(skip_serializing_if = "Option::is_none")]
395 pub graphic_build: Option<AnimationGraphicBuild>,
396 #[serde(default, skip_serializing_if = "Vec::is_empty")]
397 pub templates: Vec<AnimationTemplate>,
398}
399
400#[derive(Debug, Clone, Serialize, Deserialize)]
401#[serde(rename_all = "camelCase")]
402pub struct AnimationGraphicBuild {
403 pub kind: String,
404 #[serde(skip_serializing_if = "Option::is_none")]
405 pub build: Option<String>,
406 #[serde(skip_serializing_if = "Option::is_none")]
407 pub reverse: Option<bool>,
408 #[serde(skip_serializing_if = "Option::is_none")]
409 pub animate_background: Option<bool>,
410}
411
412#[derive(Debug, Clone, Serialize, Deserialize)]
413#[serde(rename_all = "camelCase")]
414pub struct AnimationTemplate {
415 pub level: u32,
416 #[serde(default, skip_serializing_if = "Vec::is_empty")]
417 pub nodes: Vec<AnimationNode>,
418}