charming_fork_zephyr/component/
radius_axis.rs

1use serde::Serialize;
2
3use crate::element::{AxisLabel, AxisLine, AxisType, BoundaryGap, NameLocation, TextStyle};
4
5/// Radius axis in polar coordinate.
6#[derive(Serialize)]
7#[serde(rename_all = "camelCase")]
8pub struct RadiusAxis {
9    #[serde(skip_serializing_if = "Option::is_none")]
10    id: Option<String>,
11
12    #[serde(skip_serializing_if = "Option::is_none")]
13    polar_index: Option<i64>,
14
15    #[serde(skip_serializing_if = "Option::is_none")]
16    type_: Option<AxisType>,
17
18    #[serde(skip_serializing_if = "Option::is_none")]
19    name: Option<String>,
20
21    #[serde(skip_serializing_if = "Option::is_none")]
22    name_location: Option<NameLocation>,
23
24    #[serde(skip_serializing_if = "Option::is_none")]
25    name_text_style: Option<TextStyle>,
26
27    #[serde(skip_serializing_if = "Option::is_none")]
28    name_gap: Option<i64>,
29
30    #[serde(skip_serializing_if = "Option::is_none")]
31    name_rotation: Option<i64>,
32
33    #[serde(skip_serializing_if = "Option::is_none")]
34    inverse: Option<bool>,
35
36    #[serde(skip_serializing_if = "Option::is_none")]
37    boundary_gap: Option<BoundaryGap>,
38
39    #[serde(skip_serializing_if = "Option::is_none")]
40    min: Option<i64>,
41
42    #[serde(skip_serializing_if = "Option::is_none")]
43    max: Option<i64>,
44
45    #[serde(skip_serializing_if = "Option::is_none")]
46    scale: Option<bool>,
47
48    #[serde(skip_serializing_if = "Option::is_none")]
49    split_number: Option<i64>,
50
51    #[serde(skip_serializing_if = "Option::is_none")]
52    min_interval: Option<i64>,
53
54    #[serde(skip_serializing_if = "Option::is_none")]
55    max_interval: Option<i64>,
56
57    #[serde(skip_serializing_if = "Option::is_none")]
58    interval: Option<i64>,
59
60    #[serde(skip_serializing_if = "Option::is_none")]
61    log_base: Option<i64>,
62
63    #[serde(skip_serializing_if = "Option::is_none")]
64    axis_label: Option<AxisLabel>,
65
66    #[serde(skip_serializing_if = "Option::is_none")]
67    axis_line: Option<AxisLine>,
68
69    #[serde(skip_serializing_if = "Vec::is_empty")]
70    data: Vec<String>,
71}
72
73impl RadiusAxis {
74    pub fn new() -> Self {
75        Self {
76            id: None,
77            polar_index: None,
78            type_: None,
79            name: None,
80            name_location: None,
81            name_text_style: None,
82            name_gap: None,
83            name_rotation: None,
84            inverse: None,
85            boundary_gap: None,
86            min: None,
87            max: None,
88            scale: None,
89            split_number: None,
90            min_interval: None,
91            max_interval: None,
92            interval: None,
93            log_base: None,
94            axis_label: None,
95            axis_line: None,
96            data: vec![],
97        }
98    }
99
100    pub fn id<S: Into<String>>(mut self, id: S) -> Self {
101        self.id = Some(id.into());
102        self
103    }
104
105    pub fn polar_index<F: Into<i64>>(mut self, polar_index: F) -> Self {
106        self.polar_index = Some(polar_index.into());
107        self
108    }
109
110    pub fn type_<T: Into<AxisType>>(mut self, type_: T) -> Self {
111        self.type_ = Some(type_.into());
112        self
113    }
114
115    pub fn name<S: Into<String>>(mut self, name: S) -> Self {
116        self.name = Some(name.into());
117        self
118    }
119
120    pub fn name_location<L: Into<NameLocation>>(mut self, name_location: L) -> Self {
121        self.name_location = Some(name_location.into());
122        self
123    }
124
125    pub fn name_text_style<T: Into<TextStyle>>(mut self, name_text_style: T) -> Self {
126        self.name_text_style = Some(name_text_style.into());
127        self
128    }
129
130    pub fn name_gap<F: Into<i64>>(mut self, name_gap: F) -> Self {
131        self.name_gap = Some(name_gap.into());
132        self
133    }
134
135    pub fn name_rotation<F: Into<i64>>(mut self, name_rotation: F) -> Self {
136        self.name_rotation = Some(name_rotation.into());
137        self
138    }
139
140    pub fn inverse(mut self, inverse: bool) -> Self {
141        self.inverse = Some(inverse);
142        self
143    }
144
145    pub fn boundary_gap<B: Into<BoundaryGap>>(mut self, boundary_gap: B) -> Self {
146        self.boundary_gap = Some(boundary_gap.into());
147        self
148    }
149
150    pub fn min<F: Into<i64>>(mut self, min: F) -> Self {
151        self.min = Some(min.into());
152        self
153    }
154
155    pub fn max<F: Into<i64>>(mut self, max: F) -> Self {
156        self.max = Some(max.into());
157        self
158    }
159
160    pub fn scale(mut self, scale: bool) -> Self {
161        self.scale = Some(scale);
162        self
163    }
164
165    pub fn split_number<F: Into<i64>>(mut self, split_number: F) -> Self {
166        self.split_number = Some(split_number.into());
167        self
168    }
169
170    pub fn min_interval<F: Into<i64>>(mut self, min_interval: F) -> Self {
171        self.min_interval = Some(min_interval.into());
172        self
173    }
174
175    pub fn max_interval<F: Into<i64>>(mut self, max_interval: F) -> Self {
176        self.max_interval = Some(max_interval.into());
177        self
178    }
179
180    pub fn interval<F: Into<i64>>(mut self, interval: F) -> Self {
181        self.interval = Some(interval.into());
182        self
183    }
184
185    pub fn log_base<F: Into<i64>>(mut self, log_base: F) -> Self {
186        self.log_base = Some(log_base.into());
187        self
188    }
189
190    pub fn axis_label<A: Into<AxisLabel>>(mut self, axis_label: A) -> Self {
191        self.axis_label = Some(axis_label.into());
192        self
193    }
194
195    pub fn axis_line<A: Into<AxisLine>>(mut self, axis_line: A) -> Self {
196        self.axis_line = Some(axis_line.into());
197        self
198    }
199
200    pub fn data<S: Into<String>>(mut self, data: Vec<S>) -> Self {
201        self.data = data.into_iter().map(|s| s.into()).collect();
202        self
203    }
204}