use iref::IriRefBuf;
use locspan::Loc;
use langtag::LanguageTagBuf;
pub use rdf_types::{BlankIdBuf, StringLiteral};
#[derive(Clone, Debug)]
pub enum Iri<F> {
IriRef(IriRefBuf),
Compact(Option<Loc<String, F>>, Loc<String, F>),
}
pub struct Document<F> {
pub statements: Vec<Loc<Statement<F>, F>>,
}
impl<F> Document<F> {
pub fn base_prefix(&self) -> Option<iref::IriRef> {
for stm in &self.statements {
if let Statement::Directive(Directive::Base(iri)) = stm.as_ref() {
return Some(iri.as_iri_ref());
}
}
None
}
}
pub enum Statement<F> {
Directive(Directive<F>),
Triples(Loc<Subject<F>, F>, Vec<Loc<PredicateObjects<F>, F>>),
}
pub enum Directive<F> {
Prefix(Loc<String, F>, Loc<IriRefBuf, F>),
Base(Loc<IriRefBuf, F>),
SparqlPrefix(Loc<String, F>, Loc<IriRefBuf, F>),
SparqlBase(Loc<IriRefBuf, F>),
}
#[derive(Debug)]
pub enum Verb<F> {
A,
Predicate(Iri<F>),
}
#[derive(Debug)]
pub enum BlankNode<F> {
Label(BlankIdBuf),
Anonymous(Vec<Loc<PredicateObjects<F>, F>>),
}
pub enum Subject<F> {
Iri(Iri<F>),
BlankNode(BlankNode<F>),
Collection(Vec<Loc<Object<F>, F>>),
}
#[derive(Debug)]
pub enum Object<F> {
Iri(Iri<F>),
BlankNode(BlankNode<F>),
Collection(Vec<Loc<Self, F>>),
Literal(Literal<F>),
}
#[derive(Debug)]
pub struct PredicateObjects<F> {
pub verb: Loc<Verb<F>, F>,
pub objects: Loc<Vec<Loc<Object<F>, F>>, F>,
}
#[derive(Debug)]
pub enum Literal<F> {
Rdf(RdfLiteral<F>),
Numeric(Numeric),
Boolean(bool),
}
#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
pub enum RdfLiteral<F> {
String(Loc<StringLiteral, F>),
TypedString(Loc<StringLiteral, F>, Loc<IriRefBuf, F>),
LangString(Loc<StringLiteral, F>, Loc<LanguageTagBuf, F>),
}
pub use crate::lexing::Numeric;