ekg_metadata/
predicate.rs1#![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 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}