iso10383_static/
_serde.rs1#[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
37struct 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}