use rdf_syntax::{Id, Iri, IriBuf};
use std::fmt;
use crate::{JsonLdLenient, syntax::JsonLdKeyword};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum JsonLdTerm {
Null,
Id(JsonLdLenient<Id>),
Keyword(JsonLdKeyword),
}
impl JsonLdTerm {
pub fn is_null(&self) -> bool {
matches!(self, JsonLdTerm::Null)
}
pub fn into_iri(self) -> Result<IriBuf, Self> {
match self {
JsonLdTerm::Id(JsonLdLenient::Valid(Id::Iri(id))) => Ok(id),
term => Err(term),
}
}
pub fn is_keyword(&self) -> bool {
matches!(self, JsonLdTerm::Keyword(_))
}
pub fn as_iri(&self) -> Option<&Iri> {
match self {
JsonLdTerm::Id(p) => p.as_iri(),
_ => None,
}
}
pub fn as_str(&self) -> &str {
match self {
JsonLdTerm::Id(p) => p.as_str(),
JsonLdTerm::Keyword(k) => k.into_str(),
JsonLdTerm::Null => "",
}
}
}
impl From<IriBuf> for JsonLdTerm {
fn from(id: IriBuf) -> JsonLdTerm {
JsonLdTerm::Id(JsonLdLenient::Valid(Id::Iri(id)))
}
}
impl From<JsonLdLenient<Id>> for JsonLdTerm {
fn from(prop: JsonLdLenient<Id>) -> JsonLdTerm {
JsonLdTerm::Id(prop)
}
}
impl fmt::Display for JsonLdTerm {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.as_str().fmt(f)
}
}