1use std::collections::BTreeMap;
14
15use serde::{Deserialize, Serialize};
16
17use crate::source_layout::default_gap;
18pub use crate::source_layout::ExclusionSource;
19pub use crate::source_page::{EdgeSource, PageLayerSource, PageSource};
20pub use crate::source_table::{TableSource, TableStyleRuleSource};
21pub use crate::source_text::TextSourceOptions;
22pub use crate::source_transform::{MirrorSource, TransformSource};
23
24use crate::{
25 Alignment, CollisionBounds, Color, Distribution, ImageOptions, LayoutConstraints, LayoutMode,
26 Length,
27};
28
29#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
31#[serde(rename_all = "snake_case")]
32pub enum ModelKind {
33 Document,
35 Canvas,
37 Dataset,
39}
40
41#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
43#[serde(deny_unknown_fields)]
44pub struct TemplateSourceV1 {
45 pub filemaker: String,
47 pub model: ModelKind,
49 pub id: String,
51 #[serde(default)]
53 pub page: Option<PageSource>,
54 #[serde(default)]
56 pub collision: Option<CollisionSource>,
57 #[serde(default)]
59 pub includes: Vec<IncludeSource>,
60 #[serde(default)]
62 pub components: BTreeMap<String, ComponentSource>,
63 #[serde(default)]
65 pub themes: BTreeMap<String, ThemeSource>,
66 #[serde(default)]
68 pub theme: Option<String>,
69 #[serde(default)]
71 pub style: StyleSource,
72 #[serde(default)]
74 pub styles: BTreeMap<String, StyleSource>,
75 #[serde(default)]
77 pub guides: BTreeMap<String, Length>,
78 #[serde(default)]
80 pub regions: BTreeMap<String, RegionSource>,
81 #[serde(default)]
83 pub exclusions: BTreeMap<String, ExclusionSource>,
84 #[serde(default)]
86 pub data_schema: BTreeMap<String, DataFieldSource>,
87 #[serde(default)]
89 pub elements: Vec<ElementSource>,
90 #[serde(default)]
92 pub ai: Option<AiSourcePolicy>,
93}
94
95#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
97#[serde(deny_unknown_fields)]
98pub struct IncludeSource {
99 pub path: String,
101 #[serde(default)]
103 pub namespace: Option<String>,
104}
105
106#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
108#[serde(deny_unknown_fields)]
109pub struct ComponentSource {
110 #[serde(default)]
112 pub props: BTreeMap<String, serde_json::Value>,
113 #[serde(default)]
115 pub slots: BTreeMap<String, Vec<ElementSource>>,
116 #[serde(default)]
118 pub elements: Vec<ElementSource>,
119}
120
121#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
123#[serde(deny_unknown_fields)]
124pub struct ThemeSource {
125 #[serde(default)]
127 pub extends: Option<String>,
128 #[serde(default)]
130 pub tokens: BTreeMap<String, serde_json::Value>,
131 #[serde(default)]
133 pub style: StyleSource,
134}
135
136#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
138#[serde(default, deny_unknown_fields)]
139pub struct StyleSource {
140 pub fill: Option<ColorSource>,
142 pub stroke: Option<ColorSource>,
144 pub stroke_width: Option<Length>,
146 pub opacity: Option<u32>,
148 pub font: Option<String>,
150 pub font_size: Option<Length>,
152 pub color: Option<ColorSource>,
154}
155
156#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
158#[serde(untagged)]
159pub enum ColorSource {
160 Text(String),
162 Typed(Color),
164}
165
166#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
168#[serde(deny_unknown_fields)]
169pub struct ElementStyleRuleSource {
170 pub when: String,
172 pub style: StyleSource,
174}
175
176#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
178#[serde(deny_unknown_fields)]
179pub struct RegionSource {
180 pub x: Length,
182 pub y: Length,
184 pub width: Length,
186 pub height: Length,
188 #[serde(default)]
190 pub collision: Option<CollisionSource>,
191}
192
193#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
195#[serde(rename_all = "snake_case")]
196pub enum DataTypeSource {
197 String,
199 Integer,
201 Decimal,
203 Boolean,
205 Date,
207 DateTime,
209 Duration,
211 Currency,
213 Array,
215 Object,
217 Null,
219}
220
221#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
223#[serde(deny_unknown_fields)]
224pub struct DataFieldSource {
225 #[serde(rename = "type")]
227 pub data_type: DataTypeSource,
228 #[serde(default)]
230 pub nullable: bool,
231 #[serde(default)]
233 pub computed: Option<String>,
234}
235
236#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
238#[serde(deny_unknown_fields)]
239pub struct ElementSource {
240 pub id: String,
242 #[serde(rename = "type")]
244 pub element_type: String,
245 #[serde(default)]
247 pub component: Option<String>,
248 #[serde(default)]
250 pub props: BTreeMap<String, serde_json::Value>,
251 #[serde(default)]
253 pub slots: BTreeMap<String, Vec<ElementSource>>,
254 #[serde(default)]
256 pub x: Option<Length>,
257 #[serde(default)]
259 pub y: Option<Length>,
260 #[serde(default)]
262 pub width: Option<Length>,
263 #[serde(default)]
265 pub height: Option<Length>,
266 #[serde(default)]
268 pub constraints: LayoutConstraints,
269 #[serde(default)]
271 pub align_x: Option<Alignment>,
272 #[serde(default)]
274 pub align_y: Option<Alignment>,
275 #[serde(default)]
277 pub text: Option<String>,
278 #[serde(default)]
280 pub text_options: TextSourceOptions,
281 #[serde(default)]
283 pub table: Option<TableSource>,
284 #[serde(default)]
286 pub asset: Option<String>,
287 #[serde(default)]
289 pub image: ImageOptions,
290 #[serde(default)]
292 pub path: Vec<PathCommandSource>,
293 #[serde(default)]
295 pub styles: Vec<String>,
296 #[serde(default)]
298 pub style: StyleSource,
299 #[serde(default)]
301 pub style_rules: Vec<ElementStyleRuleSource>,
302 #[serde(default)]
304 pub transform: TransformSource,
305 #[serde(default)]
307 pub layout: LayoutMode,
308 #[serde(default)]
310 pub distribute: Distribution,
311 #[serde(default = "default_gap")]
313 pub gap: Length,
314 #[serde(default)]
316 pub binding: Option<String>,
317 #[serde(default)]
319 pub when: Option<String>,
320 #[serde(default)]
322 pub repeat: Option<String>,
323 #[serde(default)]
325 pub anchors: BTreeMap<String, String>,
326 #[serde(default)]
328 pub region: Option<String>,
329 #[serde(default)]
331 pub children: Vec<ElementSource>,
332 #[serde(default)]
334 pub locked: bool,
335 #[serde(default)]
337 pub hidden: bool,
338 #[serde(default)]
340 pub layer: String,
341 #[serde(default)]
343 pub z_index: i32,
344 #[serde(default)]
346 pub collision: Option<CollisionSource>,
347 #[serde(skip)]
349 #[doc(hidden)]
350 pub provenance_components: Vec<String>,
351 #[serde(skip)]
353 #[doc(hidden)]
354 pub provenance_source: Option<String>,
355}
356
357#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
359#[serde(untagged)]
360pub enum CollisionSource {
361 Enabled(bool),
363 Advanced(CollisionAdvancedSource),
365}
366
367impl Default for CollisionSource {
368 fn default() -> Self {
369 Self::Advanced(CollisionAdvancedSource::default())
370 }
371}
372
373#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
375#[serde(default, deny_unknown_fields)]
376pub struct CollisionAdvancedSource {
377 pub enabled: bool,
379 pub group: String,
381 pub collides_with: Vec<String>,
383 pub ignore: Vec<String>,
385 pub priority: i32,
387 pub movable: bool,
389 pub bounds: CollisionBounds,
391 pub policy: String,
393}
394
395impl Default for CollisionAdvancedSource {
396 fn default() -> Self {
397 Self {
398 enabled: true,
399 group: "default".to_owned(),
400 collides_with: Vec::new(),
401 ignore: Vec::new(),
402 priority: 0,
403 movable: true,
404 bounds: CollisionBounds::Layout,
405 policy: "push".to_owned(),
406 }
407 }
408}
409
410#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
412#[serde(tag = "command", rename_all = "snake_case", deny_unknown_fields)]
413pub enum PathCommandSource {
414 Move {
416 x: Length,
418 y: Length,
420 },
421 Line {
423 x: Length,
425 y: Length,
427 },
428 Curve {
430 x1: Length,
432 y1: Length,
434 x2: Length,
436 y2: Length,
438 x: Length,
440 y: Length,
442 },
443 Close,
445}
446
447#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
449#[serde(deny_unknown_fields)]
450pub struct AiSourcePolicy {
451 #[serde(default)]
453 pub purpose: String,
454 #[serde(default)]
456 pub rules: Vec<String>,
457 #[serde(default)]
459 pub editable: Vec<String>,
460 #[serde(default)]
462 pub locked: Vec<String>,
463}