use borrow_or_share::Bos;
use iri_rfc3987::Iri;
use crate::{
BlankNodeId,
Literal,
ModelError,
Triple,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum NoExtension {}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(
deny_unknown_fields,
bound(
serialize = "Text: serde::Serialize, Extension: serde::Serialize",
deserialize = "Text: serde::Deserialize<'de>, Iri<Text>: serde::Deserialize<'de>, Extension: serde::Deserialize<'de>"
)
)]
pub enum Term<Text: Bos<str> + AsRef<str> = String, Extension = NoExtension> {
Iri(Iri<Text>),
BlankNode(BlankNodeId<Text>),
Literal(Literal<Text>),
Triple(Box<Triple<Text, Extension>>),
Extension(Extension),
}
impl<Text: Bos<str> + AsRef<str>, Extension> Term<Text, Extension> {
#[must_use]
pub const fn iri(iri: Iri<Text>) -> Self {
Self::Iri(iri)
}
#[must_use]
pub const fn literal(literal: Literal<Text>) -> Self {
Self::Literal(literal)
}
#[must_use]
pub fn triple(triple: Triple<Text, Extension>) -> Self {
Self::Triple(Box::new(triple))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(
deny_unknown_fields,
bound(
serialize = "Text: serde::Serialize, Extension: serde::Serialize",
deserialize = "Text: serde::Deserialize<'de>, Iri<Text>: serde::Deserialize<'de>, Extension: serde::Deserialize<'de>"
)
)]
pub enum Subject<Text: Bos<str> + AsRef<str> = String, Extension = NoExtension> {
Iri(Iri<Text>),
BlankNode(BlankNodeId<Text>),
Extension(Extension),
}
impl<Text: Bos<str> + AsRef<str>, Extension> TryFrom<Term<Text, Extension>>
for Subject<Text, Extension>
{
type Error = ModelError;
fn try_from(term: Term<Text, Extension>) -> Result<Self, Self::Error> {
match term {
Term::Iri(iri) => Ok(Self::Iri(iri)),
Term::BlankNode(blank) => Ok(Self::BlankNode(blank)),
Term::Extension(extension) => Ok(Self::Extension(extension)),
Term::Literal(_) | Term::Triple(_) => Err(ModelError::InvalidSubject),
}
}
}