charming_fork_zephyr/element/
mark_point.rs1use serde::Serialize;
2
3#[derive(Serialize)]
4#[serde(rename_all = "snake_case")]
5pub enum MarkPointDataType {
6 Min,
7 Max,
8 Average,
9}
10
11impl From<&str> for MarkPointDataType {
12 fn from(s: &str) -> Self {
13 match s {
14 "min" => Self::Min,
15 "max" => Self::Max,
16 "avg" | "average" => Self::Average,
17 _ => panic!("Invalid MarkPointDataType"),
18 }
19 }
20}
21
22#[derive(Serialize)]
23#[serde(rename_all = "camelCase")]
24pub struct MarkPointData {
25 #[serde(skip_serializing_if = "Option::is_none")]
26 #[serde(rename = "type")]
27 type_: Option<MarkPointDataType>,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
30 name: Option<String>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
33 x_axis: Option<i64>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
36 y_axis: Option<i64>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
39 value: Option<i64>,
40}
41
42impl MarkPointData {
43 pub fn new() -> Self {
44 Self {
45 type_: None,
46 name: None,
47 x_axis: None,
48 y_axis: None,
49 value: None,
50 }
51 }
52
53 pub fn type_<T: Into<MarkPointDataType>>(mut self, type_: T) -> Self {
54 self.type_ = Some(type_.into());
55 self
56 }
57
58 pub fn name<S: Into<String>>(mut self, name: S) -> Self {
59 self.name = Some(name.into());
60 self
61 }
62
63 pub fn x_axis<F: Into<i64>>(mut self, x_axis: F) -> Self {
64 self.x_axis = Some(x_axis.into());
65 self
66 }
67
68 pub fn y_axis<F: Into<i64>>(mut self, y_axis: F) -> Self {
69 self.y_axis = Some(y_axis.into());
70 self
71 }
72
73 pub fn value<F: Into<i64>>(mut self, value: F) -> Self {
74 self.value = Some(value.into());
75 self
76 }
77}
78
79impl From<(&str, &str)> for MarkPointData {
80 fn from((type_, name): (&str, &str)) -> Self {
81 Self::new().type_(type_).name(name)
82 }
83}
84
85#[derive(Serialize)]
86#[serde(rename_all = "camelCase")]
87pub struct MarkPoint {
88 #[serde(skip_serializing_if = "Vec::is_empty")]
89 data: Vec<MarkPointData>,
90}
91
92impl MarkPoint {
93 pub fn new() -> Self {
94 Self { data: vec![] }
95 }
96
97 pub fn data<D: Into<MarkPointData>>(mut self, data: Vec<D>) -> Self {
98 self.data = data.into_iter().map(|d| d.into()).collect();
99 self
100 }
101}