#[cfg(feature = "generalized")]
pub use crate::generalized::model::*;
use std::fmt;
use std::fmt::Write;
#[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Copy, Hash)]
pub struct NamedNode<'a> {
pub iri: &'a str,
}
impl<'a> fmt::Display for NamedNode<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "<{}>", self.iri)
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub struct BlankNode<'a> {
pub id: &'a str,
}
impl<'a> fmt::Display for BlankNode<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "_:{}", self.id)
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub enum Literal<'a> {
Simple {
value: &'a str,
},
LanguageTaggedString {
value: &'a str,
language: &'a str,
},
Typed {
value: &'a str,
datatype: NamedNode<'a>,
},
}
impl<'a> fmt::Display for Literal<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Literal::Simple { value } => fmt_quoted_str(value, f),
Literal::LanguageTaggedString { value, language } => {
fmt_quoted_str(value, f)?;
write!(f, "@{}", language)
}
Literal::Typed { value, datatype } => {
fmt_quoted_str(value, f)?;
write!(f, "^^{}", datatype)
}
}
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub enum Subject<'a> {
NamedNode(NamedNode<'a>),
BlankNode(BlankNode<'a>),
Triple(&'a Triple<'a>),
}
impl<'a> fmt::Display for Subject<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Subject::NamedNode(node) => node.fmt(f),
Subject::BlankNode(node) => node.fmt(f),
Subject::Triple(triple) => write!(f, "<< {} >>", triple),
}
}
}
impl<'a> From<NamedNode<'a>> for Subject<'a> {
#[inline]
fn from(node: NamedNode<'a>) -> Self {
Subject::NamedNode(node)
}
}
impl<'a> From<BlankNode<'a>> for Subject<'a> {
#[inline]
fn from(node: BlankNode<'a>) -> Self {
Subject::BlankNode(node)
}
}
impl<'a> From<&'a Triple<'a>> for Subject<'a> {
#[inline]
fn from(triple: &'a Triple<'a>) -> Self {
Subject::Triple(triple)
}
}
impl<'a> From<GraphName<'a>> for Subject<'a> {
#[inline]
fn from(node: GraphName<'a>) -> Self {
match node {
GraphName::BlankNode(node) => Subject::BlankNode(node),
GraphName::NamedNode(node) => Subject::NamedNode(node),
}
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub enum Term<'a> {
NamedNode(NamedNode<'a>),
BlankNode(BlankNode<'a>),
Literal(Literal<'a>),
Triple(&'a Triple<'a>),
}
impl<'a> fmt::Display for Term<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Term::NamedNode(node) => node.fmt(f),
Term::BlankNode(node) => node.fmt(f),
Term::Literal(literal) => literal.fmt(f),
Term::Triple(triple) => write!(f, "<< {} >>", triple),
}
}
}
impl<'a> From<NamedNode<'a>> for Term<'a> {
#[inline]
fn from(node: NamedNode<'a>) -> Self {
Term::NamedNode(node)
}
}
impl<'a> From<BlankNode<'a>> for Term<'a> {
#[inline]
fn from(node: BlankNode<'a>) -> Self {
Term::BlankNode(node)
}
}
impl<'a> From<Literal<'a>> for Term<'a> {
#[inline]
fn from(literal: Literal<'a>) -> Self {
Term::Literal(literal)
}
}
impl<'a> From<&'a Triple<'a>> for Term<'a> {
#[inline]
fn from(triple: &'a Triple<'a>) -> Self {
Term::Triple(triple)
}
}
impl<'a> From<Subject<'a>> for Term<'a> {
#[inline]
fn from(resource: Subject<'a>) -> Self {
match resource {
Subject::NamedNode(node) => Term::NamedNode(node),
Subject::BlankNode(node) => Term::BlankNode(node),
Subject::Triple(triple) => Term::Triple(triple),
}
}
}
impl<'a> From<GraphName<'a>> for Term<'a> {
#[inline]
fn from(resource: GraphName<'a>) -> Self {
match resource {
GraphName::NamedNode(node) => Term::NamedNode(node),
GraphName::BlankNode(node) => Term::BlankNode(node),
}
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub struct Triple<'a> {
pub subject: Subject<'a>,
pub predicate: NamedNode<'a>,
pub object: Term<'a>,
}
impl<'a> fmt::Display for Triple<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} {} {}", self.subject, self.predicate, self.object)
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub enum GraphName<'a> {
NamedNode(NamedNode<'a>),
BlankNode(BlankNode<'a>),
}
impl<'a> fmt::Display for GraphName<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
GraphName::NamedNode(node) => node.fmt(f),
GraphName::BlankNode(node) => node.fmt(f),
}
}
}
impl<'a> From<NamedNode<'a>> for GraphName<'a> {
#[inline]
fn from(node: NamedNode<'a>) -> Self {
GraphName::NamedNode(node)
}
}
impl<'a> From<BlankNode<'a>> for GraphName<'a> {
#[inline]
fn from(node: BlankNode<'a>) -> Self {
GraphName::BlankNode(node)
}
}
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub struct Quad<'a> {
pub subject: Subject<'a>,
pub predicate: NamedNode<'a>,
pub object: Term<'a>,
pub graph_name: Option<GraphName<'a>>,
}
impl<'a> fmt::Display for Quad<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(graph_name) = self.graph_name {
write!(
f,
"{} {} {} {}",
self.subject, self.predicate, self.object, graph_name
)
} else {
write!(f, "{} {} {}", self.subject, self.predicate, self.object)
}
}
}
#[inline]
fn fmt_quoted_str(string: &str, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_char('"')?;
for c in string.chars() {
match c {
'\n' => f.write_str("\\n"),
'\r' => f.write_str("\\r"),
'"' => f.write_str("\\\""),
'\\' => f.write_str("\\\\"),
c => f.write_char(c),
}?;
}
f.write_char('"')
}