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 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}