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}