use borrow_or_share::Bos;
use iri_rfc3987::Iri;
use crate::{
BlankNodeId,
NoExtension,
Subject,
Term,
};
#[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 struct Triple<Text: Bos<str> + AsRef<str> = String, Extension = NoExtension> {
subject: Subject<Text, Extension>,
predicate: Iri<Text>,
object: Term<Text, Extension>,
}
impl<Text: Bos<str> + AsRef<str>, Extension> Triple<Text, Extension> {
#[must_use]
pub const fn new(
subject: Subject<Text, Extension>,
predicate: Iri<Text>,
object: Term<Text, Extension>,
) -> Self {
Self {
subject,
predicate,
object,
}
}
#[must_use]
pub fn into_parts(self) -> (Subject<Text, Extension>, Iri<Text>, Term<Text, Extension>) {
(self.subject, self.predicate, self.object)
}
#[must_use]
pub const fn subject(&self) -> &Subject<Text, Extension> {
&self.subject
}
#[must_use]
pub const fn predicate(&self) -> &Iri<Text> {
&self.predicate
}
#[must_use]
pub const fn object(&self) -> &Term<Text, Extension> {
&self.object
}
}
#[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 GraphName<Text: Bos<str> + AsRef<str> = String, Extension = NoExtension> {
Default,
Iri(Iri<Text>),
BlankNode(BlankNodeId<Text>),
Extension(Extension),
}
#[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 struct Quad<Text: Bos<str> + AsRef<str> = String, Extension = NoExtension> {
triple: Triple<Text, Extension>,
graph: GraphName<Text, Extension>,
}
impl<Text: Bos<str> + AsRef<str>, Extension> Quad<Text, Extension> {
#[must_use]
pub const fn new(triple: Triple<Text, Extension>, graph: GraphName<Text, Extension>) -> Self {
Self { triple, graph }
}
#[must_use]
pub fn into_parts(self) -> (Triple<Text, Extension>, GraphName<Text, Extension>) {
(self.triple, self.graph)
}
#[must_use]
pub const fn triple(&self) -> &Triple<Text, Extension> {
&self.triple
}
#[must_use]
pub const fn graph(&self) -> &GraphName<Text, Extension> {
&self.graph
}
}