Skip to main content

grain_id/
serde.rs

1use super::*;
2#[cfg(feature = "std")]
3use crate::GrainIdPrefix;
4use ::serde::{Deserialize, Serialize, de::Error};
5
6impl Serialize for GrainId {
7    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
8    where
9        S: ::serde::Serializer,
10    {
11        if serializer.is_human_readable() {
12            let chars = self.to_chars();
13            let mut buf = [0; 7];
14            for i in 0..7 {
15                buf[i] = u8::try_from(chars[i]).unwrap();
16            }
17            let s = unsafe { str::from_utf8_unchecked(&buf) };
18            serializer.serialize_str(s)
19        } else {
20            serializer.serialize_u64(self.to_u64())
21        }
22    }
23}
24
25impl<'de> Deserialize<'de> for GrainId {
26    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
27    where
28        D: ::serde::Deserializer<'de>,
29    {
30        if deserializer.is_human_readable() {
31            #[cfg(feature = "std")]
32            {
33                <String as Deserialize>::deserialize(deserializer)?
34                    .parse::<GrainId>()
35                    .map_err(D::Error::custom)
36            }
37            #[cfg(not(feature = "std"))]
38            {
39                (<&str as Deserialize>::deserialize(deserializer)?)
40                    .parse::<GrainId>()
41                    .map_err(D::Error::custom)
42            }
43        } else {
44            let i = u64::deserialize(deserializer)?;
45            GrainId::from_u64(i).map_err(D::Error::custom)
46        }
47    }
48}
49
50#[cfg(feature = "std")]
51impl Serialize for GrainIdPrefix {
52    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
53    where
54        S: ::serde::Serializer,
55    {
56        if serializer.is_human_readable() {
57            serializer.serialize_str(&self.to_string())
58        } else {
59            use ::serde::ser::SerializeTuple;
60            let mut tup = serializer.serialize_tuple(2)?;
61            tup.serialize_element(&self.value())?;
62            tup.serialize_element(&self.len())?;
63            tup.end()
64        }
65    }
66}
67
68#[cfg(feature = "std")]
69impl<'de> Deserialize<'de> for GrainIdPrefix {
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: ::serde::Deserializer<'de>,
73    {
74        if deserializer.is_human_readable() {
75            <String as Deserialize>::deserialize(deserializer)?
76                .parse::<GrainIdPrefix>()
77                .map_err(D::Error::custom)
78        } else {
79            let (value, len) = <(u64, u8) as Deserialize>::deserialize(deserializer)?;
80            if len > 7 {
81                return Err(D::Error::custom(crate::Error::InvalidLength(len as usize)));
82            }
83            Ok(GrainIdPrefix::new(value, len))
84        }
85    }
86}