1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
use std::fmt; use iref::Iri; use json::JsonValue; use crate::{ Id, Reference, BlankId, util::AsJson }; use super::Keyword; pub trait TermLike { fn as_iri(&self) -> Option<Iri>; fn as_str(&self) -> &str; } #[derive(Clone, PartialEq, Eq, Hash, Debug)] pub enum Term<T: Id> { Null, Ref(Reference<T>), Keyword(Keyword) } impl<T: Id> Term<T> { pub fn into_id(self) -> Result<T, Self> { match self { Term::Ref(Reference::Id(id)) => Ok(id), term => Err(term) } } pub fn as_str(&self) -> &str { match self { Term::Ref(p) => p.as_str(), Term::Keyword(k) => k.into_str(), Term::Null => "" } } pub fn is_keyword(&self) -> bool { match self { Term::Keyword(_) => true, _ => false } } pub fn as_iri(&self) -> Option<Iri> { match self { Term::Ref(p) => p.as_iri(), _ => None } } } impl<T: Id> TermLike for Term<T> { fn as_iri(&self) -> Option<Iri> { self.as_iri() } fn as_str(&self) -> &str { self.as_str() } } impl<T: Id> From<T> for Term<T> { fn from(id: T) -> Term<T> { Term::Ref(Reference::Id(id)) } } impl<T: Id> From<BlankId> for Term<T> { fn from(blank: BlankId) -> Term<T> { Term::Ref(Reference::Blank(blank)) } } impl<T: Id> From<Reference<T>> for Term<T> { fn from(prop: Reference<T>) -> Term<T> { Term::Ref(prop) } } impl<T: Id + fmt::Display> fmt::Display for Term<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Term::Ref(p) => p.fmt(f), Term::Keyword(kw) => kw.into_str().fmt(f), Term::Null => write!(f, "null") } } } impl<T: Id> AsJson for Term<T> { fn as_json(&self) -> JsonValue { match self { Term::Ref(p) => p.as_str().into(), Term::Keyword(kw) => kw.into_str().into(), Term::Null => JsonValue::Null } } }