apache_echarts_wrapper/
axis_typing.rs1use serde::{Serialize, Serializer};
2use crate::options::AxisType;
3
4pub trait AxisInfo{
5 const AXIS_TYPE: AxisType;
6}
7pub struct ValueAxis;
8
9pub struct CategoryAxis;
10
11pub struct TimeAxis;
12
13impl AxisInfo for TimeAxis {
14 const AXIS_TYPE: AxisType = AxisType::Time;
15}
16
17impl AxisInfo for ValueAxis {
18 const AXIS_TYPE: AxisType = AxisType::Value;
19}
20
21impl AxisInfo for CategoryAxis {
22 const AXIS_TYPE: AxisType = AxisType::Category;
23}
24
25pub struct DefaultSerialisation;
26
27pub trait SerializeFormat<T: ?Sized> {
28 fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
29 where
30 S: Serializer;
31}
32
33impl<T: serde::Serialize + ?Sized> SerializeFormat<T> for DefaultSerialisation {
34 fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: Serializer,
37 {
38 value.serialize(serializer)
39 }
40}
41
42#[derive(Debug,Clone)]
44pub struct ValueSerializeWrapper<T: AxisKindMarker>(T);
45
46
47impl <T: AxisKindMarker> From<T> for ValueSerializeWrapper<T> {
48 fn from(value: T) -> Self {
49 ValueSerializeWrapper(value)
50 }
51}
52
53impl<T: AxisKindMarker> Serialize for ValueSerializeWrapper<T> {
54 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
55 where
56 S: Serializer
57 {
58 T::Serialization::serialize(&self.0, serializer)
59 }
60}
61
62pub trait AxisKindMarker {
63 type AxisType : AxisInfo;
64 type Serialization: SerializeFormat<Self>
65 where
66 Self: Sized;
67}
68
69use crate::impl_default_marker;
70
71impl_default_marker!(ValueAxis for u128 i128 i32 u32 i64 u64 i16 u16 i8 u8 f32 f64 usize isize);
72
73impl_default_marker!(CategoryAxis for String &str);