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}