figma_api/models/
text_path_node.rs

1/*
2 * Figma API
3 *
4 * This is the OpenAPI specification for the [Figma REST API](https://www.figma.com/developers/api).  Note: we are releasing the OpenAPI specification as a beta given the large surface area and complexity of the REST API. If you notice any inaccuracies with the specification, please [file an issue](https://github.com/figma/rest-api-spec/issues).
5 *
6 * The version of the OpenAPI document: 0.31.0
7 * Contact: support@figma.com
8 * Generated by: https://openapi-generator.tech
9 */
10
11use crate::models;
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
15pub struct TextPathNode {
16    /// A string uniquely identifying this node within the document.
17    #[serde(rename = "id")]
18    pub id: String,
19    /// The name given to the node by the user in the tool.
20    #[serde(rename = "name")]
21    pub name: String,
22    /// Whether or not the node is visible on the canvas.
23    #[serde(rename = "visible", skip_serializing_if = "Option::is_none")]
24    pub visible: Option<bool>,
25    /// If true, layer is locked and cannot be edited
26    #[serde(rename = "locked", skip_serializing_if = "Option::is_none")]
27    pub locked: Option<bool>,
28    /// Whether the layer is fixed while the parent is scrolling
29    #[serde(rename = "isFixed", skip_serializing_if = "Option::is_none")]
30    pub is_fixed: Option<bool>,
31    /// How layer should be treated when the frame is resized
32    #[serde(rename = "scrollBehavior")]
33    pub scroll_behavior: ScrollBehavior,
34    /// The rotation of the node, if not 0.
35    #[serde(rename = "rotation", skip_serializing_if = "Option::is_none")]
36    pub rotation: Option<f64>,
37    /// A mapping of a layer's property to component property name of component properties attached to this node. The component property name can be used to look up more information on the corresponding component's or component set's componentPropertyDefinitions.
38    #[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    /// A mapping of variable collection ID to mode ID representing the explicitly set modes for this node.
47    #[serde(rename = "explicitVariableModes", skip_serializing_if = "Option::is_none")]
48    pub explicit_variable_modes: Option<std::collections::HashMap<String, String>>,
49    /// How this node blends with nodes behind it in the scene (see blend mode section for more details)
50    #[serde(rename = "blendMode")]
51    pub blend_mode: models::BlendMode,
52    /// Opacity of the node
53    #[serde(rename = "opacity", skip_serializing_if = "Option::is_none")]
54    pub opacity: Option<f64>,
55    /// Keep height and width constrained to same ratio.
56    #[serde(rename = "preserveRatio", skip_serializing_if = "Option::is_none")]
57    pub preserve_ratio: Option<bool>,
58    /// Horizontal and vertical layout constraints for node.
59    #[serde(rename = "constraints", skip_serializing_if = "Option::is_none")]
60    pub constraints: Option<Box<models::LayoutConstraint>>,
61    /// A transformation matrix is standard way in computer graphics to represent translation and rotation. These are the top two rows of a 3x3 matrix. The bottom row of the matrix is assumed to be [0, 0, 1]. This is known as an affine transform and is enough to represent translation, rotation, and skew.  The identity transform is [[1, 0, 0], [0, 1, 0]].  A translation matrix will typically look like:  ``` [[1, 0, tx],   [0, 1, ty]] ```  and a rotation matrix will typically look like:  ``` [[cos(angle), sin(angle), 0],   [-sin(angle), cos(angle), 0]] ```  Another way to think about this transform is as three vectors:  - The x axis (t[0][0], t[1][0]) - The y axis (t[0][1], t[1][1]) - The translation offset (t[0][2], t[1][2])  The most common usage of the Transform matrix is the `relativeTransform property`. This particular usage of the matrix has a few additional restrictions. The translation offset can take on any value but we do enforce that the axis vectors are unit vectors (i.e. have length 1). The axes are not required to be at 90° angles to each other.
62    #[serde(rename = "relativeTransform", skip_serializing_if = "Option::is_none")]
63    pub relative_transform: Option<Vec<Vec<f64>>>,
64    /// Width and height of element. This is different from the width and height of the bounding box in that the absolute bounding box represents the element after scaling and rotation. Only present if `geometry=paths` is passed.
65    #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
66    pub size: Option<Box<models::Vector>>,
67    ///  Determines if the layer should stretch along the parent's counter axis. This property is only provided for direct children of auto-layout frames.  - `INHERIT` - `STRETCH`  In previous versions of auto layout, determined how the layer is aligned inside an auto-layout frame. This property is only provided for direct children of auto-layout frames.  - `MIN` - `CENTER` - `MAX` - `STRETCH`  In horizontal auto-layout frames, \"MIN\" and \"MAX\" correspond to \"TOP\" and \"BOTTOM\". In vertical auto-layout frames, \"MIN\" and \"MAX\" correspond to \"LEFT\" and \"RIGHT\".
68    #[serde(rename = "layoutAlign", skip_serializing_if = "Option::is_none")]
69    pub layout_align: Option<LayoutAlign>,
70    /// This property is applicable only for direct children of auto-layout frames, ignored otherwise. Determines whether a layer should stretch along the parent's primary axis. A `0` corresponds to a fixed size and `1` corresponds to stretch.
71    #[serde(rename = "layoutGrow", skip_serializing_if = "Option::is_none")]
72    pub layout_grow: Option<f64>,
73    /// Determines whether a layer's size and position should be determined by auto-layout settings or manually adjustable.
74    #[serde(rename = "layoutPositioning", skip_serializing_if = "Option::is_none")]
75    pub layout_positioning: Option<LayoutPositioning>,
76    /// The minimum width of the frame. This property is only applicable for auto-layout frames or direct children of auto-layout frames.
77    #[serde(rename = "minWidth", skip_serializing_if = "Option::is_none")]
78    pub min_width: Option<f64>,
79    /// The maximum width of the frame. This property is only applicable for auto-layout frames or direct children of auto-layout frames.
80    #[serde(rename = "maxWidth", skip_serializing_if = "Option::is_none")]
81    pub max_width: Option<f64>,
82    /// The minimum height of the frame. This property is only applicable for auto-layout frames or direct children of auto-layout frames.
83    #[serde(rename = "minHeight", skip_serializing_if = "Option::is_none")]
84    pub min_height: Option<f64>,
85    /// The maximum height of the frame. This property is only applicable for auto-layout frames or direct children of auto-layout frames.
86    #[serde(rename = "maxHeight", skip_serializing_if = "Option::is_none")]
87    pub max_height: Option<f64>,
88    /// The horizontal sizing setting on this auto-layout frame or frame child. - `FIXED` - `HUG`: only valid on auto-layout frames and text nodes - `FILL`: only valid on auto-layout frame children
89    #[serde(rename = "layoutSizingHorizontal", skip_serializing_if = "Option::is_none")]
90    pub layout_sizing_horizontal: Option<LayoutSizingHorizontal>,
91    /// The vertical sizing setting on this auto-layout frame or frame child. - `FIXED` - `HUG`: only valid on auto-layout frames and text nodes - `FILL`: only valid on auto-layout frame children
92    #[serde(rename = "layoutSizingVertical", skip_serializing_if = "Option::is_none")]
93    pub layout_sizing_vertical: Option<LayoutSizingVertical>,
94    /// An array of fill paints applied to the node.
95    #[serde(rename = "fills")]
96    pub fills: Vec<models::Paint>,
97    /// A mapping of a StyleType to style ID (see Style) of styles present on this node. The style ID can be used to look up more information about the style in the top-level styles field.
98    #[serde(rename = "styles", skip_serializing_if = "Option::is_none")]
99    pub styles: Option<std::collections::HashMap<String, String>>,
100    /// An array of stroke paints applied to the node.
101    #[serde(rename = "strokes", skip_serializing_if = "Option::is_none")]
102    pub strokes: Option<Vec<models::Paint>>,
103    /// The weight of strokes on the node.
104    #[serde(rename = "strokeWeight", skip_serializing_if = "Option::is_none")]
105    pub stroke_weight: Option<f64>,
106    /// Position of stroke relative to vector outline, as a string enum  - `INSIDE`: stroke drawn inside the shape boundary - `OUTSIDE`: stroke drawn outside the shape boundary - `CENTER`: stroke drawn centered along the shape boundary
107    #[serde(rename = "strokeAlign", skip_serializing_if = "Option::is_none")]
108    pub stroke_align: Option<StrokeAlign>,
109    /// A string enum with value of \"MITER\", \"BEVEL\", or \"ROUND\", describing how corners in vector paths are rendered.
110    #[serde(rename = "strokeJoin", skip_serializing_if = "Option::is_none")]
111    pub stroke_join: Option<StrokeJoin>,
112    /// An array of floating point numbers describing the pattern of dash length and gap lengths that the vector stroke will use when drawn.  For example a value of [1, 2] indicates that the stroke will be drawn with a dash of length 1 followed by a gap of length 2, repeated.
113    #[serde(rename = "strokeDashes", skip_serializing_if = "Option::is_none")]
114    pub stroke_dashes: Option<Vec<f64>>,
115    /// Only specified if parameter `geometry=paths` is used. An array of paths representing the object fill.
116    #[serde(rename = "fillGeometry", skip_serializing_if = "Option::is_none")]
117    pub fill_geometry: Option<Vec<models::Path>>,
118    /// Only specified if parameter `geometry=paths` is used. An array of paths representing the object stroke.
119    #[serde(rename = "strokeGeometry", skip_serializing_if = "Option::is_none")]
120    pub stroke_geometry: Option<Vec<models::Path>>,
121    /// A string enum describing the end caps of vector paths.
122    #[serde(rename = "strokeCap", skip_serializing_if = "Option::is_none")]
123    pub stroke_cap: Option<StrokeCap>,
124    /// Only valid if `strokeJoin` is \"MITER\". The corner angle, in degrees, below which `strokeJoin` will be set to \"BEVEL\" to avoid super sharp corners. By default this is 28.96 degrees.
125    #[serde(rename = "strokeMiterAngle", skip_serializing_if = "Option::is_none")]
126    pub stroke_miter_angle: Option<f64>,
127    /// An array of export settings representing images to export from the node.
128    #[serde(rename = "exportSettings", skip_serializing_if = "Option::is_none")]
129    pub export_settings: Option<Vec<models::ExportSetting>>,
130    /// An array of effects attached to this node (see effects section for more details)
131    #[serde(rename = "effects")]
132    pub effects: Vec<models::Effect>,
133    /// Does this node mask sibling nodes in front of it?
134    #[serde(rename = "isMask", skip_serializing_if = "Option::is_none")]
135    pub is_mask: Option<bool>,
136    /// If this layer is a mask, this property describes the operation used to mask the layer's siblings. The value may be one of the following:  - ALPHA: the mask node's alpha channel will be used to determine the opacity of each pixel in the masked result. - VECTOR: if the mask node has visible fill paints, every pixel inside the node's fill regions will be fully visible in the masked result. If the mask has visible stroke paints, every pixel inside the node's stroke regions will be fully visible in the masked result. - LUMINANCE: the luminance value of each pixel of the mask node will be used to determine the opacity of that pixel in the masked result.
137    #[serde(rename = "maskType", skip_serializing_if = "Option::is_none")]
138    pub mask_type: Option<MaskType>,
139    /// True if maskType is VECTOR. This field is deprecated; use maskType instead.
140    #[serde(rename = "isMaskOutline", skip_serializing_if = "Option::is_none")]
141    pub is_mask_outline: Option<bool>,
142    /// Node ID of node to transition to in prototyping
143    #[serde(rename = "transitionNodeID", skip_serializing_if = "Option::is_none")]
144    pub transition_node_id: Option<String>,
145    /// The duration of the prototyping transition on this node (in milliseconds). This will override the default transition duration on the prototype, for this node.
146    #[serde(rename = "transitionDuration", skip_serializing_if = "Option::is_none")]
147    pub transition_duration: Option<f64>,
148    /// The easing curve used in the prototyping transition on this node.
149    #[serde(rename = "transitionEasing", skip_serializing_if = "Option::is_none")]
150    pub transition_easing: Option<models::EasingType>,
151    /// The raw characters in the text path node.
152    #[serde(rename = "characters")]
153    pub characters: String,
154    /// Style of text including font family and weight.
155    #[serde(rename = "style")]
156    pub style: Box<models::TextPathTypeStyle>,
157    /// The array corresponds to characters in the text box, where each element references the 'styleOverrideTable' to apply specific styles to each character. The array's length can be less than or equal to the number of characters due to the removal of trailing zeros. Elements with a value of 0 indicate characters that use the default type style. If the array is shorter than the total number of characters, the characters beyond the array's length also use the default style.
158    #[serde(rename = "characterStyleOverrides")]
159    pub character_style_overrides: Vec<f64>,
160    /// Internal property, preserved for backward compatibility. Avoid using this value.
161    #[serde(rename = "layoutVersion", skip_serializing_if = "Option::is_none")]
162    pub layout_version: Option<f64>,
163    /// Map from ID to TextPathTypeStyle for looking up style overrides.
164    #[serde(rename = "styleOverrideTable")]
165    pub style_override_table: std::collections::HashMap<String, models::TextPathTypeStyle>,
166}
167
168impl TextPathNode {
169    pub fn new(id: String, name: String, scroll_behavior: ScrollBehavior, blend_mode: models::BlendMode, fills: Vec<models::Paint>, effects: Vec<models::Effect>, characters: String, style: models::TextPathTypeStyle, character_style_overrides: Vec<f64>, style_override_table: std::collections::HashMap<String, models::TextPathTypeStyle>) -> TextPathNode {
170        TextPathNode {
171            id,
172            name,
173            visible: None,
174            locked: None,
175            is_fixed: None,
176            scroll_behavior,
177            rotation: None,
178            component_property_references: None,
179            plugin_data: None,
180            shared_plugin_data: None,
181            bound_variables: None,
182            explicit_variable_modes: None,
183            blend_mode,
184            opacity: None,
185            preserve_ratio: None,
186            constraints: None,
187            relative_transform: None,
188            size: None,
189            layout_align: None,
190            layout_grow: None,
191            layout_positioning: None,
192            min_width: None,
193            max_width: None,
194            min_height: None,
195            max_height: None,
196            layout_sizing_horizontal: None,
197            layout_sizing_vertical: None,
198            fills,
199            styles: None,
200            strokes: None,
201            stroke_weight: None,
202            stroke_align: None,
203            stroke_join: None,
204            stroke_dashes: None,
205            fill_geometry: None,
206            stroke_geometry: None,
207            stroke_cap: None,
208            stroke_miter_angle: None,
209            export_settings: None,
210            effects,
211            is_mask: None,
212            mask_type: None,
213            is_mask_outline: None,
214            transition_node_id: None,
215            transition_duration: None,
216            transition_easing: None,
217            characters,
218            style: Box::new(style),
219            character_style_overrides,
220            layout_version: None,
221            style_override_table,
222        }
223    }
224}
225/// How layer should be treated when the frame is resized
226#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
227pub enum ScrollBehavior {
228    #[serde(rename = "SCROLLS")]
229    Scrolls,
230    #[serde(rename = "FIXED")]
231    Fixed,
232    #[serde(rename = "STICKY_SCROLLS")]
233    StickyScrolls,
234}
235
236impl Default for ScrollBehavior {
237    fn default() -> ScrollBehavior {
238        Self::Scrolls
239    }
240}
241///  Determines if the layer should stretch along the parent's counter axis. This property is only provided for direct children of auto-layout frames.  - `INHERIT` - `STRETCH`  In previous versions of auto layout, determined how the layer is aligned inside an auto-layout frame. This property is only provided for direct children of auto-layout frames.  - `MIN` - `CENTER` - `MAX` - `STRETCH`  In horizontal auto-layout frames, \"MIN\" and \"MAX\" correspond to \"TOP\" and \"BOTTOM\". In vertical auto-layout frames, \"MIN\" and \"MAX\" correspond to \"LEFT\" and \"RIGHT\".
242#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
243pub enum LayoutAlign {
244    #[serde(rename = "INHERIT")]
245    Inherit,
246    #[serde(rename = "STRETCH")]
247    Stretch,
248    #[serde(rename = "MIN")]
249    Min,
250    #[serde(rename = "CENTER")]
251    Center,
252    #[serde(rename = "MAX")]
253    Max,
254}
255
256impl Default for LayoutAlign {
257    fn default() -> LayoutAlign {
258        Self::Inherit
259    }
260}
261/// Determines whether a layer's size and position should be determined by auto-layout settings or manually adjustable.
262#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
263pub enum LayoutPositioning {
264    #[serde(rename = "AUTO")]
265    Auto,
266    #[serde(rename = "ABSOLUTE")]
267    Absolute,
268}
269
270impl Default for LayoutPositioning {
271    fn default() -> LayoutPositioning {
272        Self::Auto
273    }
274}
275/// The horizontal sizing setting on this auto-layout frame or frame child. - `FIXED` - `HUG`: only valid on auto-layout frames and text nodes - `FILL`: only valid on auto-layout frame children
276#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
277pub enum LayoutSizingHorizontal {
278    #[serde(rename = "FIXED")]
279    Fixed,
280    #[serde(rename = "HUG")]
281    Hug,
282    #[serde(rename = "FILL")]
283    Fill,
284}
285
286impl Default for LayoutSizingHorizontal {
287    fn default() -> LayoutSizingHorizontal {
288        Self::Fixed
289    }
290}
291/// The vertical sizing setting on this auto-layout frame or frame child. - `FIXED` - `HUG`: only valid on auto-layout frames and text nodes - `FILL`: only valid on auto-layout frame children
292#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
293pub enum LayoutSizingVertical {
294    #[serde(rename = "FIXED")]
295    Fixed,
296    #[serde(rename = "HUG")]
297    Hug,
298    #[serde(rename = "FILL")]
299    Fill,
300}
301
302impl Default for LayoutSizingVertical {
303    fn default() -> LayoutSizingVertical {
304        Self::Fixed
305    }
306}
307/// Position of stroke relative to vector outline, as a string enum  - `INSIDE`: stroke drawn inside the shape boundary - `OUTSIDE`: stroke drawn outside the shape boundary - `CENTER`: stroke drawn centered along the shape boundary
308#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
309pub enum StrokeAlign {
310    #[serde(rename = "INSIDE")]
311    Inside,
312    #[serde(rename = "OUTSIDE")]
313    Outside,
314    #[serde(rename = "CENTER")]
315    Center,
316}
317
318impl Default for StrokeAlign {
319    fn default() -> StrokeAlign {
320        Self::Inside
321    }
322}
323/// A string enum with value of \"MITER\", \"BEVEL\", or \"ROUND\", describing how corners in vector paths are rendered.
324#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
325pub enum StrokeJoin {
326    #[serde(rename = "MITER")]
327    Miter,
328    #[serde(rename = "BEVEL")]
329    Bevel,
330    #[serde(rename = "ROUND")]
331    Round,
332}
333
334impl Default for StrokeJoin {
335    fn default() -> StrokeJoin {
336        Self::Miter
337    }
338}
339/// A string enum describing the end caps of vector paths.
340#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
341pub enum StrokeCap {
342    #[serde(rename = "NONE")]
343    None,
344    #[serde(rename = "ROUND")]
345    Round,
346    #[serde(rename = "SQUARE")]
347    Square,
348    #[serde(rename = "LINE_ARROW")]
349    LineArrow,
350    #[serde(rename = "TRIANGLE_ARROW")]
351    TriangleArrow,
352    #[serde(rename = "DIAMOND_FILLED")]
353    DiamondFilled,
354    #[serde(rename = "CIRCLE_FILLED")]
355    CircleFilled,
356    #[serde(rename = "TRIANGLE_FILLED")]
357    TriangleFilled,
358    #[serde(rename = "WASHI_TAPE_1")]
359    WashiTape1,
360    #[serde(rename = "WASHI_TAPE_2")]
361    WashiTape2,
362    #[serde(rename = "WASHI_TAPE_3")]
363    WashiTape3,
364    #[serde(rename = "WASHI_TAPE_4")]
365    WashiTape4,
366    #[serde(rename = "WASHI_TAPE_5")]
367    WashiTape5,
368    #[serde(rename = "WASHI_TAPE_6")]
369    WashiTape6,
370}
371
372impl Default for StrokeCap {
373    fn default() -> StrokeCap {
374        Self::None
375    }
376}
377/// If this layer is a mask, this property describes the operation used to mask the layer's siblings. The value may be one of the following:  - ALPHA: the mask node's alpha channel will be used to determine the opacity of each pixel in the masked result. - VECTOR: if the mask node has visible fill paints, every pixel inside the node's fill regions will be fully visible in the masked result. If the mask has visible stroke paints, every pixel inside the node's stroke regions will be fully visible in the masked result. - LUMINANCE: the luminance value of each pixel of the mask node will be used to determine the opacity of that pixel in the masked result.
378#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
379pub enum MaskType {
380    #[serde(rename = "ALPHA")]
381    Alpha,
382    #[serde(rename = "VECTOR")]
383    Vector,
384    #[serde(rename = "LUMINANCE")]
385    Luminance,
386}
387
388impl Default for MaskType {
389    fn default() -> MaskType {
390        Self::Alpha
391    }
392}
393