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}