1use crate::models;
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
15pub struct SectionNode {
16 #[serde(rename = "id")]
18 pub id: String,
19 #[serde(rename = "name")]
21 pub name: String,
22 #[serde(rename = "visible", skip_serializing_if = "Option::is_none")]
24 pub visible: Option<bool>,
25 #[serde(rename = "locked", skip_serializing_if = "Option::is_none")]
27 pub locked: Option<bool>,
28 #[serde(rename = "isFixed", skip_serializing_if = "Option::is_none")]
30 pub is_fixed: Option<bool>,
31 #[serde(rename = "scrollBehavior")]
33 pub scroll_behavior: ScrollBehavior,
34 #[serde(rename = "rotation", skip_serializing_if = "Option::is_none")]
36 pub rotation: Option<f64>,
37 #[serde(rename = "componentPropertyReferences", skip_serializing_if = "Option::is_none")]
39 pub component_property_references: Option<std::collections::HashMap<String, String>>,
40 #[serde(rename = "pluginData", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")]
41 pub plugin_data: Option<Option<serde_json::Value>>,
42 #[serde(rename = "sharedPluginData", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")]
43 pub shared_plugin_data: Option<Option<serde_json::Value>>,
44 #[serde(rename = "boundVariables", skip_serializing_if = "Option::is_none")]
45 pub bound_variables: Option<Box<models::IsLayerTraitBoundVariables>>,
46 #[serde(rename = "explicitVariableModes", skip_serializing_if = "Option::is_none")]
48 pub explicit_variable_modes: Option<std::collections::HashMap<String, String>>,
49 #[serde(rename = "fills")]
51 pub fills: Vec<models::Paint>,
52 #[serde(rename = "styles", skip_serializing_if = "Option::is_none")]
54 pub styles: Option<std::collections::HashMap<String, String>>,
55 #[serde(rename = "strokes", skip_serializing_if = "Option::is_none")]
57 pub strokes: Option<Vec<models::Paint>>,
58 #[serde(rename = "strokeWeight", skip_serializing_if = "Option::is_none")]
60 pub stroke_weight: Option<f64>,
61 #[serde(rename = "strokeAlign", skip_serializing_if = "Option::is_none")]
63 pub stroke_align: Option<StrokeAlign>,
64 #[serde(rename = "strokeJoin", skip_serializing_if = "Option::is_none")]
66 pub stroke_join: Option<StrokeJoin>,
67 #[serde(rename = "strokeDashes", skip_serializing_if = "Option::is_none")]
69 pub stroke_dashes: Option<Vec<f64>>,
70 #[serde(rename = "fillGeometry", skip_serializing_if = "Option::is_none")]
72 pub fill_geometry: Option<Vec<models::Path>>,
73 #[serde(rename = "strokeGeometry", skip_serializing_if = "Option::is_none")]
75 pub stroke_geometry: Option<Vec<models::Path>>,
76 #[serde(rename = "strokeCap", skip_serializing_if = "Option::is_none")]
78 pub stroke_cap: Option<StrokeCap>,
79 #[serde(rename = "strokeMiterAngle", skip_serializing_if = "Option::is_none")]
81 pub stroke_miter_angle: Option<f64>,
82 #[serde(rename = "children")]
84 pub children: Vec<models::SubcanvasNode>,
85 #[serde(rename = "preserveRatio", skip_serializing_if = "Option::is_none")]
87 pub preserve_ratio: Option<bool>,
88 #[serde(rename = "constraints", skip_serializing_if = "Option::is_none")]
90 pub constraints: Option<Box<models::LayoutConstraint>>,
91 #[serde(rename = "relativeTransform", skip_serializing_if = "Option::is_none")]
93 pub relative_transform: Option<Vec<Vec<f64>>>,
94 #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
96 pub size: Option<Box<models::Vector>>,
97 #[serde(rename = "layoutAlign", skip_serializing_if = "Option::is_none")]
99 pub layout_align: Option<LayoutAlign>,
100 #[serde(rename = "layoutGrow", skip_serializing_if = "Option::is_none")]
102 pub layout_grow: Option<f64>,
103 #[serde(rename = "layoutPositioning", skip_serializing_if = "Option::is_none")]
105 pub layout_positioning: Option<LayoutPositioning>,
106 #[serde(rename = "minWidth", skip_serializing_if = "Option::is_none")]
108 pub min_width: Option<f64>,
109 #[serde(rename = "maxWidth", skip_serializing_if = "Option::is_none")]
111 pub max_width: Option<f64>,
112 #[serde(rename = "minHeight", skip_serializing_if = "Option::is_none")]
114 pub min_height: Option<f64>,
115 #[serde(rename = "maxHeight", skip_serializing_if = "Option::is_none")]
117 pub max_height: Option<f64>,
118 #[serde(rename = "layoutSizingHorizontal", skip_serializing_if = "Option::is_none")]
120 pub layout_sizing_horizontal: Option<LayoutSizingHorizontal>,
121 #[serde(rename = "layoutSizingVertical", skip_serializing_if = "Option::is_none")]
123 pub layout_sizing_vertical: Option<LayoutSizingVertical>,
124 #[serde(rename = "sectionContentsHidden")]
126 pub section_contents_hidden: bool,
127}
128
129impl SectionNode {
130 pub fn new(id: String, name: String, scroll_behavior: ScrollBehavior, fills: Vec<models::Paint>, children: Vec<models::SubcanvasNode>, section_contents_hidden: bool) -> SectionNode {
131 SectionNode {
132 id,
133 name,
134 visible: None,
135 locked: None,
136 is_fixed: None,
137 scroll_behavior,
138 rotation: None,
139 component_property_references: None,
140 plugin_data: None,
141 shared_plugin_data: None,
142 bound_variables: None,
143 explicit_variable_modes: None,
144 fills,
145 styles: None,
146 strokes: None,
147 stroke_weight: None,
148 stroke_align: None,
149 stroke_join: None,
150 stroke_dashes: None,
151 fill_geometry: None,
152 stroke_geometry: None,
153 stroke_cap: None,
154 stroke_miter_angle: None,
155 children,
156 preserve_ratio: None,
157 constraints: None,
158 relative_transform: None,
159 size: None,
160 layout_align: None,
161 layout_grow: None,
162 layout_positioning: None,
163 min_width: None,
164 max_width: None,
165 min_height: None,
166 max_height: None,
167 layout_sizing_horizontal: None,
168 layout_sizing_vertical: None,
169 section_contents_hidden,
170 }
171 }
172}
173#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
175pub enum ScrollBehavior {
176 #[serde(rename = "SCROLLS")]
177 Scrolls,
178 #[serde(rename = "FIXED")]
179 Fixed,
180 #[serde(rename = "STICKY_SCROLLS")]
181 StickyScrolls,
182}
183
184impl Default for ScrollBehavior {
185 fn default() -> ScrollBehavior {
186 Self::Scrolls
187 }
188}
189#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
191pub enum StrokeAlign {
192 #[serde(rename = "INSIDE")]
193 Inside,
194 #[serde(rename = "OUTSIDE")]
195 Outside,
196 #[serde(rename = "CENTER")]
197 Center,
198}
199
200impl Default for StrokeAlign {
201 fn default() -> StrokeAlign {
202 Self::Inside
203 }
204}
205#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
207pub enum StrokeJoin {
208 #[serde(rename = "MITER")]
209 Miter,
210 #[serde(rename = "BEVEL")]
211 Bevel,
212 #[serde(rename = "ROUND")]
213 Round,
214}
215
216impl Default for StrokeJoin {
217 fn default() -> StrokeJoin {
218 Self::Miter
219 }
220}
221#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
223pub enum StrokeCap {
224 #[serde(rename = "NONE")]
225 None,
226 #[serde(rename = "ROUND")]
227 Round,
228 #[serde(rename = "SQUARE")]
229 Square,
230 #[serde(rename = "LINE_ARROW")]
231 LineArrow,
232 #[serde(rename = "TRIANGLE_ARROW")]
233 TriangleArrow,
234 #[serde(rename = "DIAMOND_FILLED")]
235 DiamondFilled,
236 #[serde(rename = "CIRCLE_FILLED")]
237 CircleFilled,
238 #[serde(rename = "TRIANGLE_FILLED")]
239 TriangleFilled,
240 #[serde(rename = "WASHI_TAPE_1")]
241 WashiTape1,
242 #[serde(rename = "WASHI_TAPE_2")]
243 WashiTape2,
244 #[serde(rename = "WASHI_TAPE_3")]
245 WashiTape3,
246 #[serde(rename = "WASHI_TAPE_4")]
247 WashiTape4,
248 #[serde(rename = "WASHI_TAPE_5")]
249 WashiTape5,
250 #[serde(rename = "WASHI_TAPE_6")]
251 WashiTape6,
252}
253
254impl Default for StrokeCap {
255 fn default() -> StrokeCap {
256 Self::None
257 }
258}
259#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
261pub enum LayoutAlign {
262 #[serde(rename = "INHERIT")]
263 Inherit,
264 #[serde(rename = "STRETCH")]
265 Stretch,
266 #[serde(rename = "MIN")]
267 Min,
268 #[serde(rename = "CENTER")]
269 Center,
270 #[serde(rename = "MAX")]
271 Max,
272}
273
274impl Default for LayoutAlign {
275 fn default() -> LayoutAlign {
276 Self::Inherit
277 }
278}
279#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
281pub enum LayoutPositioning {
282 #[serde(rename = "AUTO")]
283 Auto,
284 #[serde(rename = "ABSOLUTE")]
285 Absolute,
286}
287
288impl Default for LayoutPositioning {
289 fn default() -> LayoutPositioning {
290 Self::Auto
291 }
292}
293#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
295pub enum LayoutSizingHorizontal {
296 #[serde(rename = "FIXED")]
297 Fixed,
298 #[serde(rename = "HUG")]
299 Hug,
300 #[serde(rename = "FILL")]
301 Fill,
302}
303
304impl Default for LayoutSizingHorizontal {
305 fn default() -> LayoutSizingHorizontal {
306 Self::Fixed
307 }
308}
309#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
311pub enum LayoutSizingVertical {
312 #[serde(rename = "FIXED")]
313 Fixed,
314 #[serde(rename = "HUG")]
315 Hug,
316 #[serde(rename = "FILL")]
317 Fill,
318}
319
320impl Default for LayoutSizingVertical {
321 fn default() -> LayoutSizingVertical {
322 Self::Fixed
323 }
324}
325