apache_echarts_wrapper/
common.rs1use std::fmt::Write;
2use sailfish::RenderError;
3use sailfish::runtime::{Buffer, Render};
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6#[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#[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}