sophia_api/prefix/
_wrapper.rs1use super::*;
2use std::borrow::Borrow;
3
4sophia_iri::wrap! { Prefix borrowing str :
5 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}