Skip to main content

iso10383_static/
_serde.rs

1//! Serde support for generated types.
2
3#[cfg(feature = "alloc")]
4extern crate alloc;
5
6use crate::Code;
7use core::fmt::{Formatter, Result as FmtResult};
8use iso10383_types::mic;
9use serde::{
10    Deserialize, Deserializer, Serialize, Serializer,
11    de::{Error as DeError, Visitor},
12};
13
14#[cfg(feature = "alloc")]
15use alloc::{string::String, vec::Vec};
16
17impl Serialize for Code {
18    #[inline]
19    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20    where
21        S: Serializer,
22    {
23        serializer.serialize_str(self.as_mic().as_str())
24    }
25}
26
27impl<'de> Deserialize<'de> for Code {
28    #[inline]
29    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30    where
31        D: Deserializer<'de>,
32    {
33        deserializer.deserialize_any(CodeVisitor)
34    }
35}
36
37/// A visitor used to parse the code enum.
38struct CodeVisitor;
39
40impl<'de> Visitor<'de> for CodeVisitor {
41    type Value = Code;
42
43    fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
44        f.write_str("A 4-ascii-character MIC code")
45    }
46
47    #[cfg(feature = "alloc")]
48    fn visit_byte_buf<E>(self, src: Vec<u8>) -> Result<Self::Value, E>
49    where
50        E: DeError,
51    {
52        let value = mic::from_bytes(&src)
53            .map_err(|_| DeError::custom("Could not parse &mic from borrowed bytes"))?;
54        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
55    }
56
57    #[cfg(feature = "alloc")]
58    fn visit_string<E>(self, src: String) -> Result<Self::Value, E>
59    where
60        E: DeError,
61    {
62        let value = mic::from_str(&src)
63            .map_err(|_| DeError::custom("Could not parse &mic from borrowed bytes"))?;
64        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
65    }
66
67    fn visit_str<E>(self, src: &str) -> Result<Self::Value, E>
68    where
69        E: DeError,
70    {
71        let value = mic::from_str(src)
72            .map_err(|_| DeError::custom("Could not parse &mic from borrowed bytes"))?;
73        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
74    }
75
76    fn visit_bytes<E>(self, src: &[u8]) -> Result<Self::Value, E>
77    where
78        E: DeError,
79    {
80        let value = mic::from_bytes(src)
81            .map_err(|_| DeError::custom("Could not parse &mic from borrowed bytes"))?;
82        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
83    }
84
85    fn visit_borrowed_bytes<E>(self, src: &'de [u8]) -> Result<Self::Value, E>
86    where
87        E: DeError,
88    {
89        let value = mic::from_bytes(src)
90            .map_err(|_| DeError::custom("Could not parse &mic from borrowed bytes"))?;
91        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
92    }
93
94    fn visit_borrowed_str<E>(self, src: &'de str) -> Result<Self::Value, E>
95    where
96        E: DeError,
97    {
98        let value = mic::from_str(src)
99            .map_err(|_| DeError::custom("Could not parse &mic from borrowed str"))?;
100
101        Code::from_mic(value).map_err(|_| DeError::custom("Deserialized value is not valid."))
102    }
103}
104
105#[cfg(test)]
106mod test {
107    use crate::Code;
108
109    #[test]
110    fn serde_roundtrip() {
111        let start = Code::Iexg;
112        let serde = serde_json::to_string(&start).expect("ser");
113        assert_eq!("\"IEXG\"", serde);
114
115        let end = serde_json::from_str::<Code>(&serde).expect("de");
116        assert_eq!(start, end);
117    }
118}