type_safe_id/
serde.rs

1use std::fmt;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{DynamicType, StaticType, Type, TypeSafeId};
6
7#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
8impl<T: Type> Serialize for TypeSafeId<T> {
9    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
10    where
11        S: serde::Serializer,
12    {
13        serializer.serialize_str(&super::to_array_string(
14            self.type_prefix(),
15            self.data.into(),
16        ))
17    }
18}
19
20#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
21impl<'de, T: StaticType> Deserialize<'de> for TypeSafeId<T> {
22    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
23    where
24        D: serde::Deserializer<'de>,
25    {
26        struct FromStrVisitor<T>(std::marker::PhantomData<T>);
27        impl<'de, T: StaticType> serde::de::Visitor<'de> for FromStrVisitor<T> {
28            type Value = TypeSafeId<T>;
29
30            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
31                write!(
32                    formatter,
33                    "a string containing a type-id with {:?} type prefix",
34                    T::TYPE
35                )
36            }
37            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
38            where
39                E: serde::de::Error,
40            {
41                v.parse().map_err(E::custom)
42            }
43        }
44        deserializer.deserialize_str(FromStrVisitor(std::marker::PhantomData))
45    }
46}
47
48#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
49impl<'de> Deserialize<'de> for TypeSafeId<DynamicType> {
50    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
51    where
52        D: serde::Deserializer<'de>,
53    {
54        struct FromStrVisitor;
55        impl<'de> serde::de::Visitor<'de> for FromStrVisitor {
56            type Value = TypeSafeId<DynamicType>;
57
58            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
59                write!(formatter, "a string containing a type-id")
60            }
61            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
62            where
63                E: serde::de::Error,
64            {
65                v.parse().map_err(E::custom)
66            }
67        }
68        deserializer.deserialize_str(FromStrVisitor)
69    }
70}