use std::sync::Arc;
use into_owned_trait::IntoOwned;
use json_syntax::tracing::{JsonBacktrace, JsonBacktraceBuf, JsonBacktraceBuilder, JsonLocated};
use rdf_syntax::{Iri, IriBuf};
use crate::{JsonLdExpandedDocument, JsonLdFlattenedDocument};
pub type JsonLdBacktraceBuilder<'a> = JsonBacktraceBuilder<'a, JsonLdSourceFileRef<'a>>;
pub type JsonLdBacktrace = JsonBacktrace<JsonLdSourceFile>;
pub type JsonLdBacktraceBuf = JsonBacktraceBuf<JsonLdSourceFile>;
pub type JsonLdLocated<T> = JsonLocated<T, JsonLdSourceFile>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct JsonLdSourceFileRef<'a> {
pub iri: Option<&'a Iri>,
pub form: JsonLdDocumentFormRef<'a>,
}
impl<'a> JsonLdSourceFileRef<'a> {
pub fn original(iri: Option<&'a Iri>) -> Self {
Self {
iri,
form: JsonLdDocumentFormRef::Original,
}
}
pub fn expanded(iri: Option<&'a Iri>, document: &'a Arc<JsonLdExpandedDocument>) -> Self {
Self {
iri,
form: JsonLdDocumentFormRef::Expanded(document),
}
}
pub fn flattened(iri: Option<&'a Iri>, document: &'a Arc<JsonLdFlattenedDocument>) -> Self {
Self {
iri,
form: JsonLdDocumentFormRef::Flattened(document),
}
}
}
impl IntoOwned for JsonLdSourceFileRef<'_> {
type Owned = JsonLdSourceFile;
fn into_owned(self) -> JsonLdSourceFile {
JsonLdSourceFile {
iri: self.iri.map(Iri::to_owned),
form: self.form.into_owned(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum JsonLdDocumentFormRef<'a> {
Original,
Expanded(&'a Arc<JsonLdExpandedDocument>),
Flattened(&'a Arc<JsonLdFlattenedDocument>),
}
impl IntoOwned for JsonLdDocumentFormRef<'_> {
type Owned = JsonLdDocumentForm;
fn into_owned(self) -> JsonLdDocumentForm {
match self {
Self::Original => JsonLdDocumentForm::Original,
Self::Expanded(document) => JsonLdDocumentForm::Expanded(document.clone()),
Self::Flattened(document) => JsonLdDocumentForm::Flattened(document.clone()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct JsonLdSourceFile {
pub iri: Option<IriBuf>,
pub form: JsonLdDocumentForm,
}
impl JsonLdSourceFile {
pub fn original(iri: Option<IriBuf>) -> Self {
Self {
iri,
form: JsonLdDocumentForm::Original,
}
}
pub fn expanded(iri: Option<IriBuf>, document: Arc<JsonLdExpandedDocument>) -> Self {
Self {
iri,
form: JsonLdDocumentForm::Expanded(document),
}
}
pub fn flattened(iri: Option<IriBuf>, document: Arc<JsonLdFlattenedDocument>) -> Self {
Self {
iri,
form: JsonLdDocumentForm::Flattened(document),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum JsonLdDocumentForm {
Original,
Expanded(Arc<JsonLdExpandedDocument>),
Flattened(Arc<JsonLdFlattenedDocument>),
}