chart_js_wrapper/
serde.rs

1use std::time::{Instant, SystemTime};
2use serde::{Serialize, Serializer};
3use crate::ScaleType;
4
5#[derive(Debug,Clone)]
6pub struct ValueSerializeWrapper<T: WithTypeAndSerializer>(pub(crate) T);
7
8impl <T: WithTypeAndSerializer> From<T> for ValueSerializeWrapper<T> {
9    fn from(value: T) -> Self {
10        ValueSerializeWrapper(value)
11    }
12}
13
14impl<T: WithTypeAndSerializer> Serialize for ValueSerializeWrapper<T> {
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer
18    {
19        T::Serialization::serialize(&self.0, serializer)
20    }
21}
22
23pub trait WithTypeAndSerializer {
24    fn scale_type()->ScaleType;
25
26    type Serialization: SerializeFormat<Self>
27    where
28        Self: Sized;
29}
30
31
32
33
34pub struct DefaultSerialisation;
35
36pub trait SerializeFormat<T: ?Sized> {
37    fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
38    where
39        S: Serializer;
40}
41
42impl<T: serde::Serialize + ?Sized> SerializeFormat<T> for DefaultSerialisation {
43    fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        value.serialize(serializer)
48    }
49}
50
51
52#[macro_export]
53macro_rules! impl_scale_type_default {
54    ($type:ident for $($t:ty)*) => ($(
55        impl WithTypeAndSerializer for $t {
56            fn scale_type() -> ScaleType {
57                ScaleType::$type
58            }
59
60            type Serialization = DefaultSerialisation;
61        }
62    )*)
63}
64
65
66#[macro_export]
67macro_rules! impl_scale_type {
68    ($type:ident for $($t:ty)*) => ($(
69        impl WithTypeAndSerializer for $t {
70            fn scale_type() -> ScaleType {
71                ScaleType::$type
72            }
73            type Serialization = $t;
74        }
75    )*)
76}
77
78
79
80
81
82impl_scale_type_default!(Linear for u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize f32 f64);
83impl_scale_type_default!(Category for &str String);
84impl_scale_type!(Time for SystemTime Instant);
85
86
87impl SerializeFormat<SystemTime> for SystemTime{
88    fn serialize<S>(value: &SystemTime, serializer: S) -> Result<S::Ok, S::Error>
89    where
90        S: Serializer
91    {
92        let duration = value.duration_since(SystemTime::UNIX_EPOCH).unwrap();
93        let seconds = duration.as_secs();
94        let nanos = duration.subsec_nanos();
95        let seconds_f64 = seconds as f64 + nanos as f64 / 1_000_000_000.0;
96        serializer.serialize_f64(seconds_f64)
97    }
98}
99
100impl SerializeFormat<Instant> for Instant{
101    fn serialize<S>(value: &Instant, serializer: S) -> Result<S::Ok, S::Error>
102    where
103        S: Serializer
104    {
105        let duration = value.elapsed();
106        let seconds = duration.as_secs();
107        let nanos = duration.subsec_nanos();
108        let seconds_f64 = seconds as f64 + nanos as f64 / 1_000_000_000.0;
109        serializer.serialize_f64(seconds_f64)
110    }
111}