1use crate::{Exception, License};
2use core::fmt;
3use serde::de::{Error, Visitor};
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6impl Serialize for dyn License {
7 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
8 where
9 S: Serializer,
10 {
11 serializer.serialize_str(self.id())
12 }
13}
14
15impl Serialize for dyn Exception {
16 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17 where
18 S: Serializer,
19 {
20 serializer.serialize_str(self.id())
21 }
22}
23
24struct LicenseVisitor;
25
26impl<'de> Visitor<'de> for LicenseVisitor {
27 type Value = &'static dyn License;
28
29 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30 formatter.write_str("an SPDX license id")
31 }
32
33 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
34 where
35 E: Error,
36 {
37 value.parse().map_err(Error::custom)
38 }
39}
40
41impl<'de> Deserialize<'de> for &dyn License {
42 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
43 where
44 D: Deserializer<'de>,
45 {
46 deserializer.deserialize_str(LicenseVisitor)
47 }
48}
49
50struct ExceptionVisitor;
51
52impl<'de> Visitor<'de> for ExceptionVisitor {
53 type Value = &'static dyn Exception;
54
55 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
56 formatter.write_str("an SPDX exception id")
57 }
58
59 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
60 where
61 E: Error,
62 {
63 value.parse().map_err(Error::custom)
64 }
65}
66
67impl<'de> Deserialize<'de> for &dyn Exception {
68 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
69 where
70 D: Deserializer<'de>,
71 {
72 deserializer.deserialize_str(ExceptionVisitor)
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use crate::License;
79
80 #[test]
81 fn serde() {
82 let mit: &dyn License = "MIT".parse().unwrap();
83 let s = serde_json::to_string(&mit).unwrap();
84 assert_eq!(s, "\"MIT\"");
85 let _: &dyn License = serde_json::from_str(&s).unwrap();
86 }
87}