charming_fork_zephyr/series/
sunburst.rs1use serde::{Deserialize, Serialize};
2
3use crate::element::{Emphasis, ItemStyle, Label, Sort};
4
5#[derive(Serialize)]
6#[serde(rename_all = "camelCase")]
7pub struct SunburstLevel {
8 #[serde(skip_serializing_if = "Option::is_none")]
9 r0: Option<String>,
10
11 #[serde(skip_serializing_if = "Option::is_none")]
12 r: Option<String>,
13
14 #[serde(skip_serializing_if = "Option::is_none")]
15 item_style: Option<ItemStyle>,
16
17 #[serde(skip_serializing_if = "Option::is_none")]
18 label: Option<Label>,
19}
20
21impl SunburstLevel {
22 pub fn new() -> Self {
23 Self {
24 r0: None,
25 r: None,
26 item_style: None,
27 label: None,
28 }
29 }
30
31 pub fn r0<S: Into<String>>(mut self, r0: S) -> Self {
32 self.r0 = Some(r0.into());
33 self
34 }
35
36 pub fn r<S: Into<String>>(mut self, r: S) -> Self {
37 self.r = Some(r.into());
38 self
39 }
40
41 pub fn item_style(mut self, item_style: ItemStyle) -> Self {
42 self.item_style = Some(item_style);
43 self
44 }
45
46 pub fn label(mut self, label: Label) -> Self {
47 self.label = Some(label);
48 self
49 }
50}
51
52#[derive(Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct SunburstNode {
55 name: String,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
58 value: Option<i64>,
59
60 #[serde(skip_serializing_if = "Option::is_none")]
61 #[serde(skip_deserializing)]
62 item_style: Option<ItemStyle>,
63
64 #[serde(skip_serializing_if = "Vec::is_empty")]
65 children: Vec<SunburstNode>,
66}
67
68impl SunburstNode {
69 pub fn new<S: Into<String>>(name: S) -> Self {
70 Self {
71 name: name.into(),
72 value: None,
73 item_style: None,
74 children: vec![],
75 }
76 }
77
78 pub fn value(mut self, value: i64) -> Self {
79 self.value = Some(value);
80 self
81 }
82
83 pub fn item_style(mut self, item_style: ItemStyle) -> Self {
84 self.item_style = Some(item_style);
85 self
86 }
87
88 pub fn children(mut self, children: Vec<SunburstNode>) -> Self {
89 self.children = children;
90 self
91 }
92}
93
94impl From<&str> for SunburstNode {
95 fn from(name: &str) -> Self {
96 Self::new(name)
97 }
98}
99
100impl From<(&str, i64)> for SunburstNode {
101 fn from((name, value): (&str, i64)) -> Self {
102 Self::new(name).value(value)
103 }
104}
105
106impl From<(&str, i64, &str)> for SunburstNode {
107 fn from((name, value, color): (&str, i64, &str)) -> Self {
108 Self::new(name)
109 .value(value)
110 .item_style(ItemStyle::new().color(color))
111 }
112}
113
114#[derive(Serialize)]
115#[serde(rename_all = "camelCase")]
116pub struct Sunburst {
117 #[serde(rename = "type")]
118 type_: String,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
121 id: Option<String>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
124 name: Option<String>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
127 z_level: Option<u64>,
128
129 #[serde(skip_serializing_if = "Option::is_none")]
130 z: Option<u64>,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
133 center: Option<(String, String)>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
136 radius: Option<(String, String)>,
137
138 #[serde(skip_serializing_if = "Option::is_none")]
139 emphasis: Option<Emphasis>,
140
141 #[serde(skip_serializing_if = "Option::is_none")]
142 sort: Option<Sort>,
143
144 #[serde(skip_serializing_if = "Vec::is_empty")]
145 levels: Vec<SunburstLevel>,
146
147 #[serde(skip_serializing_if = "Vec::is_empty")]
148 data: Vec<SunburstNode>,
149}
150
151impl Sunburst {
152 pub fn new() -> Self {
153 Self {
154 type_: "sunburst".to_string(),
155 id: None,
156 name: None,
157 z_level: None,
158 z: None,
159 center: None,
160 radius: None,
161 emphasis: None,
162 sort: None,
163 levels: vec![],
164 data: vec![],
165 }
166 }
167
168 pub fn id<S: Into<String>>(mut self, id: S) -> Self {
169 self.id = Some(id.into());
170 self
171 }
172
173 pub fn name<S: Into<String>>(mut self, name: S) -> Self {
174 self.name = Some(name.into());
175 self
176 }
177
178 pub fn z_level(mut self, z_level: u64) -> Self {
179 self.z_level = Some(z_level);
180 self
181 }
182
183 pub fn z(mut self, z: u64) -> Self {
184 self.z = Some(z);
185 self
186 }
187
188 pub fn center<S: Into<String>>(mut self, center: (S, S)) -> Self {
189 self.center = Some((center.0.into(), center.1.into()));
190 self
191 }
192
193 pub fn radius<S: Into<String>>(mut self, radius: (S, S)) -> Self {
194 self.radius = Some((radius.0.into(), radius.1.into()));
195 self
196 }
197
198 pub fn emphasis(mut self, emphasis: Emphasis) -> Self {
199 self.emphasis = Some(emphasis);
200 self
201 }
202
203 pub fn sort(mut self, sort: Sort) -> Self {
204 self.sort = Some(sort);
205 self
206 }
207
208 pub fn levels(mut self, levels: Vec<SunburstLevel>) -> Self {
209 self.levels = levels;
210 self
211 }
212
213 pub fn data(mut self, data: Vec<SunburstNode>) -> Self {
214 self.data = data;
215 self
216 }
217}