sophia_api/prefix/
_wrapper.rs

1use super::*;
2use std::borrow::Borrow;
3
4sophia_iri::wrap! { Prefix borrowing str :
5    /// This wrapper guarantees that the underlying `str`
6    /// satisfies the `PN_PREFIX?` rule in Turtle/SPARQL.
7    pub fn new(prefix: T) -> Result<Self, InvalidPrefix> {
8        if is_valid_prefix(prefix.borrow()) {
9            Ok(Prefix(prefix))
10        } else {
11            Err(InvalidPrefix(prefix.borrow().to_string()))
12        }
13    }
14
15    /// Gets a reference to the underlying &str.
16    pub fn as_str(&self) -> &str {
17        self.0.borrow()
18    }
19}
20
21impl<T: Borrow<str>> IsPrefix for Prefix<T> {}
22
23#[cfg(feature = "serde")]
24mod _serde {
25    use super::*;
26    use serde::{
27        de::{Error, Unexpected},
28        Deserialize, Serialize,
29    };
30    use std::borrow::Borrow;
31
32    impl<'a, T: Borrow<str> + Deserialize<'a>> Deserialize<'a> for Prefix<T> {
33        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
34        where
35            D: serde::Deserializer<'a>,
36        {
37            let inner: T = T::deserialize(deserializer)?;
38            Prefix::new(inner)
39                .map_err(|err| D::Error::invalid_value(Unexpected::Str(&err.0), &"valid Prefix"))
40        }
41    }
42
43    impl<T: Borrow<str>> Serialize for Prefix<T> {
44        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45        where
46            S: serde::Serializer,
47        {
48            self.as_str().serialize(serializer)
49        }
50    }
51
52    #[cfg(test)]
53    mod test {
54        use super::*;
55
56        #[derive(Serialize, Deserialize)]
57        struct MyTable {
58            prefix: Prefix<String>,
59        }
60
61        #[derive(Serialize, Deserialize)]
62        struct MyUncheckedTable {
63            prefix: String,
64        }
65
66        #[test]
67        fn valid_prefix() {
68            let data = MyUncheckedTable {
69                prefix: "foo".into(),
70            };
71            let toml_str = toml::to_string(&data).unwrap();
72            let data2 = toml::from_str::<MyTable>(&toml_str).unwrap();
73            assert_eq!(data.prefix, data2.prefix.unwrap());
74        }
75
76        #[test]
77        fn invalid_prefix() {
78            let data = MyUncheckedTable {
79                prefix: "f o".into(),
80            };
81            let toml_str = toml::to_string(&data).unwrap();
82            let data2 = toml::from_str::<MyTable>(&toml_str);
83            assert!(data2.is_err());
84        }
85    }
86}