[go: up one dir, main page]

license/
serde.rs

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}