Skip to main content

g_type/
serde.rs

1use core::fmt::Debug;
2
3use crate::*;
4use ::serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error as DeError};
5
6impl<T, V> Serialize for GType<T, V>
7where
8    T: Serialize,
9{
10    #[inline]
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: Serializer,
14    {
15        self.value.serialize(serializer)
16    }
17}
18
19impl<'de, T, V> Deserialize<'de> for GType<T, V>
20where
21    T: PartialOrd<V::Target> + Deserialize<'de>,
22    V: Validator<T>,
23    V::Target: PartialOrd<T> + Debug,
24    V::Error: core::fmt::Display,
25{
26    #[inline]
27    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
28    where
29        D: Deserializer<'de>,
30    {
31        let value = T::deserialize(deserializer).map_err(|err| {
32            D::Error::custom(format_args!(
33                "failed deserializing T({}): {}",
34                core::any::type_name::<T>(),
35                err
36            ))
37        })?;
38
39        GType::<T, V>::try_new(value).map_err(|err| {
40            D::Error::custom(format_args!(
41                "failed constructing {}, min:{:?}, max:{:?}: {}",
42                core::any::type_name::<Self>(),
43                V::min(),
44                V::max(),
45                err
46            ))
47        })
48    }
49}