apache_echarts_wrapper/
axis_typing.rs

1use 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//provides a configurable serialization implementation for type(because we don't have access to with_serializer for generics)
43#[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);