use std::hash::Hash;
pub use jsonld_context_processing::Context;
pub use jsonld_core::{Environment, ExpandedDocument, Loader, RemoteDocument};
use jstrict::Value;
use rdfx::{
BlankIdBuf,
vocabulary::{self, BlankIdVocabulary, VocabularyMut},
};
mod array;
mod document;
mod element;
mod error;
mod expanded;
mod literal;
mod node;
mod options;
mod slice;
mod value;
mod warning;
pub use error::*;
pub use expanded::*;
pub use literal::{LiteralExpansionError, NotALiteral};
pub use options::*;
pub use slice::{SliceExpansionError, expand_slice};
pub use value::InvalidValue;
pub use warning::*;
pub(crate) use array::expand_array;
pub(crate) use document::filter_top_level_item;
pub(crate) use element::{ActiveProperty, ExpandedEntry, expand_element};
pub(crate) use jsonld_context_processing::algorithm::expand_iri_simple as expand_iri;
pub(crate) use literal::{GivenLiteralValue, LiteralValue, expand_literal};
pub(crate) use node::{expand_node, node_id_of_term};
pub(crate) use value::expand_value;
pub type ExpansionResult<T, B, E> = Result<ExpandedDocument<T, B>, Error<E>>;
pub trait WarningHandler<N: BlankIdVocabulary>: jsonld_core::warning::Handler<N, Warning<N::BlankId>> {}
impl<N: BlankIdVocabulary, H> WarningHandler<N> for H where H: jsonld_core::warning::Handler<N, Warning<N::BlankId>> {}
pub trait Expand<Iri> {
fn default_base_url(&self) -> Option<&Iri>;
async fn expand_full<N, L, W>(
&self,
vocabulary: &mut N,
context: Context<Iri, N::BlankId>,
base_url: Option<&N::Iri>,
loader: &L,
options: Options,
warnings_handler: W,
) -> ExpansionResult<N::Iri, N::BlankId, L::Error>
where
N: VocabularyMut<Iri = Iri>,
Iri: Clone + Eq + Hash,
N::BlankId: Clone + Eq + Hash,
L: Loader,
W: WarningHandler<N>;
async fn expand_with<'a, N, L>(&'a self, vocabulary: &'a mut N, loader: &'a L) -> ExpansionResult<Iri, N::BlankId, L::Error>
where
N: VocabularyMut<Iri = Iri>,
Iri: 'a + Clone + Eq + Hash,
N::BlankId: 'a + Clone + Eq + Hash,
L: Loader,
{
self.expand_full(
vocabulary,
Context::<N::Iri, N::BlankId>::new(self.default_base_url().cloned()),
self.default_base_url(),
loader,
Options::default(),
(),
)
.await
}
async fn expand<'a, L>(&'a self, loader: &'a L) -> ExpansionResult<Iri, BlankIdBuf, L::Error>
where
(): VocabularyMut<Iri = Iri>,
Iri: 'a + Clone + Eq + Hash,
L: Loader,
{
self.expand_with(vocabulary::no_vocabulary_mut(), loader).await
}
}
impl<Iri> Expand<Iri> for Value {
fn default_base_url(&self) -> Option<&Iri> {
None
}
async fn expand_full<N, L, W>(
&self,
vocabulary: &mut N,
context: Context<Iri, N::BlankId>,
base_url: Option<&Iri>,
loader: &L,
options: Options,
mut warnings_handler: W,
) -> ExpansionResult<Iri, N::BlankId, L::Error>
where
N: VocabularyMut<Iri = Iri>,
Iri: Clone + Eq + Hash,
N::BlankId: Clone + Eq + Hash,
L: Loader,
W: WarningHandler<N>,
{
document::expand(
Environment {
vocabulary,
loader,
warnings: &mut warnings_handler,
},
self,
context,
base_url,
options,
)
.await
}
}
impl<Iri> Expand<Iri> for RemoteDocument<Iri> {
fn default_base_url(&self) -> Option<&Iri> {
self.url()
}
async fn expand_full<N, L, W>(
&self,
vocabulary: &mut N,
context: Context<Iri, N::BlankId>,
base_url: Option<&Iri>,
loader: &L,
options: Options,
warnings_handler: W,
) -> ExpansionResult<Iri, N::BlankId, L::Error>
where
N: VocabularyMut<Iri = Iri>,
Iri: Clone + Eq + Hash,
N::BlankId: Clone + Eq + Hash,
L: Loader,
W: WarningHandler<N>,
{
self.document()
.expand_full(vocabulary, context, base_url, loader, options, warnings_handler)
.await
}
}