charming_fork_zephyr/element/
mark_point.rs

1use 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}