1use crate::models;
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
15pub struct BooleanOperationNode {
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 = "blendMode")]
51 pub blend_mode: models::BlendMode,
52 #[serde(rename = "opacity", skip_serializing_if = "Option::is_none")]
54 pub opacity: Option<f64>,
55 #[serde(rename = "children")]
57 pub children: Vec<models::SubcanvasNode>,
58 #[serde(rename = "preserveRatio", skip_serializing_if = "Option::is_none")]
60 pub preserve_ratio: Option<bool>,
61 #[serde(rename = "constraints", skip_serializing_if = "Option::is_none")]
63 pub constraints: Option<Box<models::LayoutConstraint>>,
64 #[serde(rename = "relativeTransform", skip_serializing_if = "Option::is_none")]
66 pub relative_transform: Option<Vec<Vec<f64>>>,
67 #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
69 pub size: Option<Box<models::Vector>>,
70 #[serde(rename = "layoutAlign", skip_serializing_if = "Option::is_none")]
72 pub layout_align: Option<LayoutAlign>,
73 #[serde(rename = "layoutGrow", skip_serializing_if = "Option::is_none")]
75 pub layout_grow: Option<f64>,
76 #[serde(rename = "layoutPositioning", skip_serializing_if = "Option::is_none")]
78 pub layout_positioning: Option<LayoutPositioning>,
79 #[serde(rename = "minWidth", skip_serializing_if = "Option::is_none")]
81 pub min_width: Option<f64>,
82 #[serde(rename = "maxWidth", skip_serializing_if = "Option::is_none")]
84 pub max_width: Option<f64>,
85 #[serde(rename = "minHeight", skip_serializing_if = "Option::is_none")]
87 pub min_height: Option<f64>,
88 #[serde(rename = "maxHeight", skip_serializing_if = "Option::is_none")]
90 pub max_height: Option<f64>,
91 #[serde(rename = "layoutSizingHorizontal", skip_serializing_if = "Option::is_none")]
93 pub layout_sizing_horizontal: Option<LayoutSizingHorizontal>,
94 #[serde(rename = "layoutSizingVertical", skip_serializing_if = "Option::is_none")]
96 pub layout_sizing_vertical: Option<LayoutSizingVertical>,
97 #[serde(rename = "fills")]
99 pub fills: Vec<models::Paint>,
100 #[serde(rename = "styles", skip_serializing_if = "Option::is_none")]
102 pub styles: Option<std::collections::HashMap<String, String>>,
103 #[serde(rename = "strokes", skip_serializing_if = "Option::is_none")]
105 pub strokes: Option<Vec<models::Paint>>,
106 #[serde(rename = "strokeWeight", skip_serializing_if = "Option::is_none")]
108 pub stroke_weight: Option<f64>,
109 #[serde(rename = "strokeAlign", skip_serializing_if = "Option::is_none")]
111 pub stroke_align: Option<StrokeAlign>,
112 #[serde(rename = "strokeJoin", skip_serializing_if = "Option::is_none")]
114 pub stroke_join: Option<StrokeJoin>,
115 #[serde(rename = "strokeDashes", skip_serializing_if = "Option::is_none")]
117 pub stroke_dashes: Option<Vec<f64>>,
118 #[serde(rename = "fillGeometry", skip_serializing_if = "Option::is_none")]
120 pub fill_geometry: Option<Vec<models::Path>>,
121 #[serde(rename = "strokeGeometry", skip_serializing_if = "Option::is_none")]
123 pub stroke_geometry: Option<Vec<models::Path>>,
124 #[serde(rename = "strokeCap", skip_serializing_if = "Option::is_none")]
126 pub stroke_cap: Option<StrokeCap>,
127 #[serde(rename = "strokeMiterAngle", skip_serializing_if = "Option::is_none")]
129 pub stroke_miter_angle: Option<f64>,
130 #[serde(rename = "exportSettings", skip_serializing_if = "Option::is_none")]
132 pub export_settings: Option<Vec<models::ExportSetting>>,
133 #[serde(rename = "effects")]
135 pub effects: Vec<models::Effect>,
136 #[serde(rename = "isMask", skip_serializing_if = "Option::is_none")]
138 pub is_mask: Option<bool>,
139 #[serde(rename = "maskType", skip_serializing_if = "Option::is_none")]
141 pub mask_type: Option<MaskType>,
142 #[serde(rename = "isMaskOutline", skip_serializing_if = "Option::is_none")]
144 pub is_mask_outline: Option<bool>,
145 #[serde(rename = "transitionNodeID", skip_serializing_if = "Option::is_none")]
147 pub transition_node_id: Option<String>,
148 #[serde(rename = "transitionDuration", skip_serializing_if = "Option::is_none")]
150 pub transition_duration: Option<f64>,
151 #[serde(rename = "transitionEasing", skip_serializing_if = "Option::is_none")]
153 pub transition_easing: Option<models::EasingType>,
154 #[serde(rename = "booleanOperation")]
156 pub boolean_operation: BooleanOperation,
157}
158
159impl BooleanOperationNode {
160 pub fn new(id: String, name: String, scroll_behavior: ScrollBehavior, blend_mode: models::BlendMode, children: Vec<models::SubcanvasNode>, fills: Vec<models::Paint>, effects: Vec<models::Effect>, boolean_operation: BooleanOperation) -> BooleanOperationNode {
161 BooleanOperationNode {
162 id,
163 name,
164 visible: None,
165 locked: None,
166 is_fixed: None,
167 scroll_behavior,
168 rotation: None,
169 component_property_references: None,
170 plugin_data: None,
171 shared_plugin_data: None,
172 bound_variables: None,
173 explicit_variable_modes: None,
174 blend_mode,
175 opacity: None,
176 children,
177 preserve_ratio: None,
178 constraints: None,
179 relative_transform: None,
180 size: None,
181 layout_align: None,
182 layout_grow: None,
183 layout_positioning: None,
184 min_width: None,
185 max_width: None,
186 min_height: None,
187 max_height: None,
188 layout_sizing_horizontal: None,
189 layout_sizing_vertical: None,
190 fills,
191 styles: None,
192 strokes: None,
193 stroke_weight: None,
194 stroke_align: None,
195 stroke_join: None,
196 stroke_dashes: None,
197 fill_geometry: None,
198 stroke_geometry: None,
199 stroke_cap: None,
200 stroke_miter_angle: None,
201 export_settings: None,
202 effects,
203 is_mask: None,
204 mask_type: None,
205 is_mask_outline: None,
206 transition_node_id: None,
207 transition_duration: None,
208 transition_easing: None,
209 boolean_operation,
210 }
211 }
212}
213#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
215pub enum ScrollBehavior {
216 #[serde(rename = "SCROLLS")]
217 Scrolls,
218 #[serde(rename = "FIXED")]
219 Fixed,
220 #[serde(rename = "STICKY_SCROLLS")]
221 StickyScrolls,
222}
223
224impl Default for ScrollBehavior {
225 fn default() -> ScrollBehavior {
226 Self::Scrolls
227 }
228}
229#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
231pub enum LayoutAlign {
232 #[serde(rename = "INHERIT")]
233 Inherit,
234 #[serde(rename = "STRETCH")]
235 Stretch,
236 #[serde(rename = "MIN")]
237 Min,
238 #[serde(rename = "CENTER")]
239 Center,
240 #[serde(rename = "MAX")]
241 Max,
242}
243
244impl Default for LayoutAlign {
245 fn default() -> LayoutAlign {
246 Self::Inherit
247 }
248}
249#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
251pub enum LayoutPositioning {
252 #[serde(rename = "AUTO")]
253 Auto,
254 #[serde(rename = "ABSOLUTE")]
255 Absolute,
256}
257
258impl Default for LayoutPositioning {
259 fn default() -> LayoutPositioning {
260 Self::Auto
261 }
262}
263#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
265pub enum LayoutSizingHorizontal {
266 #[serde(rename = "FIXED")]
267 Fixed,
268 #[serde(rename = "HUG")]
269 Hug,
270 #[serde(rename = "FILL")]
271 Fill,
272}
273
274impl Default for LayoutSizingHorizontal {
275 fn default() -> LayoutSizingHorizontal {
276 Self::Fixed
277 }
278}
279#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
281pub enum LayoutSizingVertical {
282 #[serde(rename = "FIXED")]
283 Fixed,
284 #[serde(rename = "HUG")]
285 Hug,
286 #[serde(rename = "FILL")]
287 Fill,
288}
289
290impl Default for LayoutSizingVertical {
291 fn default() -> LayoutSizingVertical {
292 Self::Fixed
293 }
294}
295#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
297pub enum StrokeAlign {
298 #[serde(rename = "INSIDE")]
299 Inside,
300 #[serde(rename = "OUTSIDE")]
301 Outside,
302 #[serde(rename = "CENTER")]
303 Center,
304}
305
306impl Default for StrokeAlign {
307 fn default() -> StrokeAlign {
308 Self::Inside
309 }
310}
311#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
313pub enum StrokeJoin {
314 #[serde(rename = "MITER")]
315 Miter,
316 #[serde(rename = "BEVEL")]
317 Bevel,
318 #[serde(rename = "ROUND")]
319 Round,
320}
321
322impl Default for StrokeJoin {
323 fn default() -> StrokeJoin {
324 Self::Miter
325 }
326}
327#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
329pub enum StrokeCap {
330 #[serde(rename = "NONE")]
331 None,
332 #[serde(rename = "ROUND")]
333 Round,
334 #[serde(rename = "SQUARE")]
335 Square,
336 #[serde(rename = "LINE_ARROW")]
337 LineArrow,
338 #[serde(rename = "TRIANGLE_ARROW")]
339 TriangleArrow,
340 #[serde(rename = "DIAMOND_FILLED")]
341 DiamondFilled,
342 #[serde(rename = "CIRCLE_FILLED")]
343 CircleFilled,
344 #[serde(rename = "TRIANGLE_FILLED")]
345 TriangleFilled,
346 #[serde(rename = "WASHI_TAPE_1")]
347 WashiTape1,
348 #[serde(rename = "WASHI_TAPE_2")]
349 WashiTape2,
350 #[serde(rename = "WASHI_TAPE_3")]
351 WashiTape3,
352 #[serde(rename = "WASHI_TAPE_4")]
353 WashiTape4,
354 #[serde(rename = "WASHI_TAPE_5")]
355 WashiTape5,
356 #[serde(rename = "WASHI_TAPE_6")]
357 WashiTape6,
358}
359
360impl Default for StrokeCap {
361 fn default() -> StrokeCap {
362 Self::None
363 }
364}
365#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
367pub enum MaskType {
368 #[serde(rename = "ALPHA")]
369 Alpha,
370 #[serde(rename = "VECTOR")]
371 Vector,
372 #[serde(rename = "LUMINANCE")]
373 Luminance,
374}
375
376impl Default for MaskType {
377 fn default() -> MaskType {
378 Self::Alpha
379 }
380}
381#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
383pub enum BooleanOperation {
384 #[serde(rename = "UNION")]
385 Union,
386 #[serde(rename = "INTERSECT")]
387 Intersect,
388 #[serde(rename = "SUBTRACT")]
389 Subtract,
390 #[serde(rename = "EXCLUDE")]
391 Exclude,
392}
393
394impl Default for BooleanOperation {
395 fn default() -> BooleanOperation {
396 Self::Union
397 }
398}
399