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
16impl<T: Borrow<str>> IsPrefix for Prefix<T> {}
17
18#[cfg(feature = "serde")]
19mod _serde {
20    use super::*;
21    use serde::{
22        de::{Error, Unexpected},
23        Deserialize, Serialize,
24    };
25    use std::borrow::Borrow;
26
27    impl<'a, T: Borrow<str> + Deserialize<'a>> Deserialize<'a> for Prefix<T> {
28        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
29        where
30            D: serde::Deserializer<'a>,
31        {
32            let inner: T = T::deserialize(deserializer)?;
33            Prefix::new(inner)
34                .map_err(|err| D::Error::invalid_value(Unexpected::Str(&err.0), &"valid Prefix"))
35        }
36    }
37
38    impl<T: Borrow<str>> Serialize for Prefix<T> {
39        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
40        where
41            S: serde::Serializer,
42        {
43            self.as_str().serialize(serializer)
44        }
45    }
46
47    #[cfg(test)]
48    mod test {
49        use super::*;
50
51        #[derive(Serialize, Deserialize)]
52        struct MyTable {
53            prefix: Prefix<String>,
54        }
55
56        #[derive(Serialize, Deserialize)]
57        struct MyUncheckedTable {
58            prefix: String,
59        }
60
61        #[test]
62        fn valid_prefix() {
63            let data = MyUncheckedTable {
64                prefix: "foo".into(),
65            };
66            let toml_str = toml::to_string(&data).unwrap();
67            let data2 = toml::from_str::<MyTable>(&toml_str).unwrap();
68            assert_eq!(data.prefix, data2.prefix.unwrap());
69        }
70
71        #[test]
72        fn invalid_prefix() {
73            let data = MyUncheckedTable {
74                prefix: "f o".into(),
75            };
76            let toml_str = toml::to_string(&data).unwrap();
77            let data2 = toml::from_str::<MyTable>(&toml_str);
78            assert!(data2.is_err());
79        }
80    }
81}