apache_echarts_wrapper/
common.rs

1use std::fmt::Write;
2use sailfish::RenderError;
3use sailfish::runtime::{Buffer, Render};
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6/// Newtype for percentage values, serialized as "{value}%"
7#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct Percent(pub f32);
9
10impl Serialize for Percent {
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where S: Serializer {
13        let s = format!("{}%", self.0);
14        serializer.serialize_str(&s)
15    }
16}
17
18impl<'de> Deserialize<'de> for Percent {
19    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20    where D: Deserializer<'de> {
21        let s = String::deserialize(deserializer)?;
22        let trimmed = s.trim_end_matches('%');
23        trimmed.parse::<f32>()
24            .map(Percent)
25            .map_err(serde::de::Error::custom)
26    }
27}
28
29
30/// Newtype for percentage values, serialized as "{value}px"
31#[derive(Debug, Clone, Copy, PartialEq)]
32pub struct Pixels(pub usize);
33
34impl Serialize for Pixels {
35    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36    where S: Serializer {
37        let s = format!("{}px", self.0);
38        serializer.serialize_str(&s)
39    }
40}
41
42impl<'de> Deserialize<'de> for Pixels {
43    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44    where D: Deserializer<'de> {
45        let s = String::deserialize(deserializer)?;
46        let trimmed = s.trim_end_matches("px");
47        trimmed.parse::<usize>()
48            .map(Pixels)
49            .map_err(serde::de::Error::custom)
50    }
51}
52
53
54#[derive(Serialize, Deserialize, Debug, Clone)]
55#[serde(untagged)]
56pub enum Size{
57    Percent(Percent),
58    Pixel(Pixels)
59}
60
61
62impl Render for Size{
63    fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
64        b.write_str(&self.to_string())?;
65        Ok(())   
66    }
67}
68
69impl Size{
70    pub fn to_string(&self) -> String{
71        match self{
72            Size::Percent(p) => format!("{}%", p.0),
73            Size::Pixel(p) => format!("{}px", p.0)
74        }
75    }
76
77    pub fn percent(f: f32) -> Self{
78        Size::Percent(Percent(f))
79    }
80
81    pub fn pixels(f: usize) -> Self{
82        Size::Pixel(Pixels(f))
83    }
84
85}