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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
use std::fmt; use std::convert::TryFrom; use iref::Iri; use json::JsonValue; use crate::{ Id, Reference, util }; use super::{ Keyword, Term, TermLike }; #[derive(Clone, PartialEq, Eq, Hash)] pub enum Type<T> { Id, Json, None, Vocab, Ref(T) } impl<T> Type<T> { pub fn into_ref(self) -> Result<T, Type<T>> { match self { Type::Ref(id) => Ok(id), typ => Err(typ) } } } impl<T: TermLike> Type<T> { pub fn as_iri(&self) -> Option<Iri> { match self { Type::Ref(id) => id.as_iri(), _ => None } } pub fn as_str(&self) -> &str { match self { Type::Id => "@id", Type::Json => "@json", Type::None => "@none", Type::Vocab => "@vocab", Type::Ref(id) => id.as_str() } } } impl<T: TermLike> TermLike for Type<T> { fn as_iri(&self) -> Option<Iri> { self.as_iri() } fn as_str(&self) -> &str { self.as_str() } } impl<T: Id> TryFrom<Term<T>> for Type<T> { type Error = Term<T>; fn try_from(term: Term<T>) -> Result<Type<T>, Term<T>> { match term { Term::Keyword(Keyword::Id) => Ok(Type::Id), Term::Keyword(Keyword::Json) => Ok(Type::Json), Term::Keyword(Keyword::None) => Ok(Type::None), Term::Keyword(Keyword::Vocab) => Ok(Type::Vocab), Term::Ref(Reference::Id(id)) => Ok(Type::Ref(id)), term => Err(term) } } } impl<T: util::AsJson> util::AsJson for Type<T> { fn as_json(&self) -> JsonValue { match self { Type::Id => "@id".into(), Type::Json => "@json".into(), Type::None => "@none".into(), Type::Vocab => "@vocab".into(), Type::Ref(id) => id.as_json() } } } impl<T: fmt::Display> fmt::Display for Type<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Type::Id => write!(f, "@id"), Type::Json => write!(f, "@json"), Type::None => write!(f, "@none"), Type::Vocab => write!(f, "@vocab"), Type::Ref(id) => id.fmt(f) } } } pub type NodeType<T> = Type<Reference<T>>; impl<T: Id> TryFrom<Term<T>> for NodeType<T> { type Error = Term<T>; fn try_from(term: Term<T>) -> Result<NodeType<T>, Term<T>> { match term { Term::Keyword(Keyword::Id) => Ok(Type::Id), Term::Keyword(Keyword::Json) => Ok(Type::Json), Term::Keyword(Keyword::None) => Ok(Type::None), Term::Keyword(Keyword::Vocab) => Ok(Type::Vocab), Term::Ref(prop) => Ok(Type::Ref(prop)), term => Err(term) } } }