1use crate::models;
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
15pub struct ConnectorNode {
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 = "preserveRatio", skip_serializing_if = "Option::is_none")]
51 pub preserve_ratio: Option<bool>,
52 #[serde(rename = "constraints", skip_serializing_if = "Option::is_none")]
54 pub constraints: Option<Box<models::LayoutConstraint>>,
55 #[serde(rename = "relativeTransform", skip_serializing_if = "Option::is_none")]
57 pub relative_transform: Option<Vec<Vec<f64>>>,
58 #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
60 pub size: Option<Box<models::Vector>>,
61 #[serde(rename = "layoutAlign", skip_serializing_if = "Option::is_none")]
63 pub layout_align: Option<LayoutAlign>,
64 #[serde(rename = "layoutGrow", skip_serializing_if = "Option::is_none")]
66 pub layout_grow: Option<f64>,
67 #[serde(rename = "layoutPositioning", skip_serializing_if = "Option::is_none")]
69 pub layout_positioning: Option<LayoutPositioning>,
70 #[serde(rename = "minWidth", skip_serializing_if = "Option::is_none")]
72 pub min_width: Option<f64>,
73 #[serde(rename = "maxWidth", skip_serializing_if = "Option::is_none")]
75 pub max_width: Option<f64>,
76 #[serde(rename = "minHeight", skip_serializing_if = "Option::is_none")]
78 pub min_height: Option<f64>,
79 #[serde(rename = "maxHeight", skip_serializing_if = "Option::is_none")]
81 pub max_height: Option<f64>,
82 #[serde(rename = "layoutSizingHorizontal", skip_serializing_if = "Option::is_none")]
84 pub layout_sizing_horizontal: Option<LayoutSizingHorizontal>,
85 #[serde(rename = "layoutSizingVertical", skip_serializing_if = "Option::is_none")]
87 pub layout_sizing_vertical: Option<LayoutSizingVertical>,
88 #[serde(rename = "blendMode")]
90 pub blend_mode: models::BlendMode,
91 #[serde(rename = "opacity", skip_serializing_if = "Option::is_none")]
93 pub opacity: Option<f64>,
94 #[serde(rename = "effects")]
96 pub effects: Vec<models::Effect>,
97 #[serde(rename = "exportSettings", skip_serializing_if = "Option::is_none")]
99 pub export_settings: Option<Vec<models::ExportSetting>>,
100 #[serde(rename = "characters")]
102 pub characters: 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 = "connectorStart")]
120 pub connector_start: Box<models::ConnectorEndpoint>,
121 #[serde(rename = "connectorEnd")]
123 pub connector_end: Box<models::ConnectorEndpoint>,
124 #[serde(rename = "connectorStartStrokeCap")]
126 pub connector_start_stroke_cap: ConnectorStartStrokeCap,
127 #[serde(rename = "connectorEndStrokeCap")]
129 pub connector_end_stroke_cap: ConnectorEndStrokeCap,
130 #[serde(rename = "connectorLineType")]
132 pub connector_line_type: models::ConnectorLineType,
133 #[serde(rename = "textBackground", skip_serializing_if = "Option::is_none")]
135 pub text_background: Option<Box<models::ConnectorTextBackground>>,
136}
137
138impl ConnectorNode {
139 pub fn new(id: String, name: String, scroll_behavior: ScrollBehavior, blend_mode: models::BlendMode, effects: Vec<models::Effect>, characters: String, connector_start: models::ConnectorEndpoint, connector_end: models::ConnectorEndpoint, connector_start_stroke_cap: ConnectorStartStrokeCap, connector_end_stroke_cap: ConnectorEndStrokeCap, connector_line_type: models::ConnectorLineType) -> ConnectorNode {
140 ConnectorNode {
141 id,
142 name,
143 visible: None,
144 locked: None,
145 is_fixed: None,
146 scroll_behavior,
147 rotation: None,
148 component_property_references: None,
149 plugin_data: None,
150 shared_plugin_data: None,
151 bound_variables: None,
152 explicit_variable_modes: None,
153 preserve_ratio: None,
154 constraints: None,
155 relative_transform: None,
156 size: None,
157 layout_align: None,
158 layout_grow: None,
159 layout_positioning: None,
160 min_width: None,
161 max_width: None,
162 min_height: None,
163 max_height: None,
164 layout_sizing_horizontal: None,
165 layout_sizing_vertical: None,
166 blend_mode,
167 opacity: None,
168 effects,
169 export_settings: None,
170 characters,
171 strokes: None,
172 stroke_weight: None,
173 stroke_align: None,
174 stroke_join: None,
175 stroke_dashes: None,
176 connector_start: Box::new(connector_start),
177 connector_end: Box::new(connector_end),
178 connector_start_stroke_cap,
179 connector_end_stroke_cap,
180 connector_line_type,
181 text_background: None,
182 }
183 }
184}
185#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
187pub enum ScrollBehavior {
188 #[serde(rename = "SCROLLS")]
189 Scrolls,
190 #[serde(rename = "FIXED")]
191 Fixed,
192 #[serde(rename = "STICKY_SCROLLS")]
193 StickyScrolls,
194}
195
196impl Default for ScrollBehavior {
197 fn default() -> ScrollBehavior {
198 Self::Scrolls
199 }
200}
201#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
203pub enum LayoutAlign {
204 #[serde(rename = "INHERIT")]
205 Inherit,
206 #[serde(rename = "STRETCH")]
207 Stretch,
208 #[serde(rename = "MIN")]
209 Min,
210 #[serde(rename = "CENTER")]
211 Center,
212 #[serde(rename = "MAX")]
213 Max,
214}
215
216impl Default for LayoutAlign {
217 fn default() -> LayoutAlign {
218 Self::Inherit
219 }
220}
221#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
223pub enum LayoutPositioning {
224 #[serde(rename = "AUTO")]
225 Auto,
226 #[serde(rename = "ABSOLUTE")]
227 Absolute,
228}
229
230impl Default for LayoutPositioning {
231 fn default() -> LayoutPositioning {
232 Self::Auto
233 }
234}
235#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
237pub enum LayoutSizingHorizontal {
238 #[serde(rename = "FIXED")]
239 Fixed,
240 #[serde(rename = "HUG")]
241 Hug,
242 #[serde(rename = "FILL")]
243 Fill,
244}
245
246impl Default for LayoutSizingHorizontal {
247 fn default() -> LayoutSizingHorizontal {
248 Self::Fixed
249 }
250}
251#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
253pub enum LayoutSizingVertical {
254 #[serde(rename = "FIXED")]
255 Fixed,
256 #[serde(rename = "HUG")]
257 Hug,
258 #[serde(rename = "FILL")]
259 Fill,
260}
261
262impl Default for LayoutSizingVertical {
263 fn default() -> LayoutSizingVertical {
264 Self::Fixed
265 }
266}
267#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
269pub enum StrokeAlign {
270 #[serde(rename = "INSIDE")]
271 Inside,
272 #[serde(rename = "OUTSIDE")]
273 Outside,
274 #[serde(rename = "CENTER")]
275 Center,
276}
277
278impl Default for StrokeAlign {
279 fn default() -> StrokeAlign {
280 Self::Inside
281 }
282}
283#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
285pub enum StrokeJoin {
286 #[serde(rename = "MITER")]
287 Miter,
288 #[serde(rename = "BEVEL")]
289 Bevel,
290 #[serde(rename = "ROUND")]
291 Round,
292}
293
294impl Default for StrokeJoin {
295 fn default() -> StrokeJoin {
296 Self::Miter
297 }
298}
299#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
301pub enum ConnectorStartStrokeCap {
302 #[serde(rename = "NONE")]
303 None,
304 #[serde(rename = "LINE_ARROW")]
305 LineArrow,
306 #[serde(rename = "TRIANGLE_ARROW")]
307 TriangleArrow,
308 #[serde(rename = "DIAMOND_FILLED")]
309 DiamondFilled,
310 #[serde(rename = "CIRCLE_FILLED")]
311 CircleFilled,
312 #[serde(rename = "TRIANGLE_FILLED")]
313 TriangleFilled,
314}
315
316impl Default for ConnectorStartStrokeCap {
317 fn default() -> ConnectorStartStrokeCap {
318 Self::None
319 }
320}
321#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
323pub enum ConnectorEndStrokeCap {
324 #[serde(rename = "NONE")]
325 None,
326 #[serde(rename = "LINE_ARROW")]
327 LineArrow,
328 #[serde(rename = "TRIANGLE_ARROW")]
329 TriangleArrow,
330 #[serde(rename = "DIAMOND_FILLED")]
331 DiamondFilled,
332 #[serde(rename = "CIRCLE_FILLED")]
333 CircleFilled,
334 #[serde(rename = "TRIANGLE_FILLED")]
335 TriangleFilled,
336}
337
338impl Default for ConnectorEndStrokeCap {
339 fn default() -> ConnectorEndStrokeCap {
340 Self::None
341 }
342}
343