ekg_metadata/
predicate.rs

1#![allow(missing_docs)]
2
3use crate::Namespace;
4
5pub struct Predicate<'a> {
6    pub namespace:  &'a Namespace,
7    pub local_name: String,
8}
9
10impl<'a> std::fmt::Display for Predicate<'a> {
11    // noinspection SpellCheckingInspection
12    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13        write!(f, "<{}{}>", self.namespace.iri, self.local_name)
14    }
15}
16
17impl<'a> Predicate<'a> {
18    pub fn display_turtle<'b>(&'a self) -> impl std::fmt::Display + 'a + 'b
19    where 'a: 'b {
20        struct TurtlePredicate<'b>(&'b Predicate<'b>);
21        impl<'b> std::fmt::Display for TurtlePredicate<'b> {
22            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
23                write!(
24                    f,
25                    "{}{}",
26                    self.0.namespace.name, self.0.local_name
27                )
28            }
29        }
30        TurtlePredicate(self)
31    }
32
33    pub fn declare(namespace: &'a Namespace, local_name: &str) -> Self {
34        Self { namespace, local_name: local_name.to_string() }
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use crate::{Namespace, Predicate};
41
42    #[test]
43    fn test_predicate() {
44        let ns = Namespace::declare(
45            "abc:",
46            iri_string::types::IriReferenceString::try_from("https://whatever.kg/def/")
47                .unwrap()
48                .try_into()
49                .unwrap(),
50        )
51        .unwrap();
52        let prd = Predicate::declare(&ns, "xyz");
53
54        let str_prd = format!("{:}", prd);
55
56        assert_eq!(str_prd.as_str(), "<https://whatever.kg/def/xyz>");
57
58        let str_prd = format!("{}", prd.display_turtle());
59
60        assert_eq!(str_prd.as_str(), "abc:xyz");
61    }
62}