chart_js_wrapper/
serde.rs1use 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}