use hashbrown::HashSet;
use json_syntax::{JsonCodeMap, JsonPrint, JsonValue, print::JsonPrintOptions};
use mime::Mime;
use rdf_syntax::{Iri, IriBuf};
pub mod expanded;
pub mod flattened;
pub mod profile;
pub use expanded::JsonLdExpandedDocument;
pub use flattened::JsonLdFlattenedDocument;
pub use profile::JsonLdProfile;
use crate::syntax::JsonLdContextDocumentValue;
#[derive(Debug, Clone)]
pub struct JsonLdDocument<T = JsonValue> {
pub url: Option<IriBuf>,
pub content_type: Option<Mime>,
pub context_url: Option<IriBuf>,
pub profile: HashSet<JsonLdProfile>,
pub source: Option<JsonLdSourceCode>,
pub document: T,
}
pub type JsonLdContextDocument = JsonLdDocument<JsonLdContextDocumentValue>;
impl<T> JsonLdDocument<T> {
pub fn new(url: Option<IriBuf>, content_type: Option<Mime>, document: T) -> Self {
Self::new_full(url, content_type, None, HashSet::new(), None, document)
}
pub fn new_full(
url: Option<IriBuf>,
content_type: Option<Mime>,
context_url: Option<IriBuf>,
profile: HashSet<JsonLdProfile>,
source: Option<JsonLdSourceCode>,
document: T,
) -> Self {
Self {
url,
content_type,
context_url,
profile,
source,
document,
}
}
pub fn map<U>(self, f: impl Fn(T) -> U) -> JsonLdDocument<U> {
JsonLdDocument {
url: self.url,
content_type: self.content_type,
context_url: self.context_url,
profile: self.profile,
source: self.source,
document: f(self.document),
}
}
pub fn try_map<U, E>(self, f: impl Fn(T) -> Result<U, E>) -> Result<JsonLdDocument<U>, E> {
Ok(JsonLdDocument {
url: self.url,
content_type: self.content_type,
context_url: self.context_url,
profile: self.profile,
source: self.source,
document: f(self.document)?,
})
}
pub fn url(&self) -> Option<&Iri> {
self.url.as_deref()
}
pub fn content_type(&self) -> Option<&Mime> {
self.content_type.as_ref()
}
pub fn context_url(&self) -> Option<&Iri> {
self.context_url.as_deref()
}
pub fn document(&self) -> &T {
&self.document
}
pub fn document_mut(&mut self) -> &mut T {
&mut self.document
}
pub fn into_document(self) -> T {
self.document
}
pub fn into_url(self) -> Option<IriBuf> {
self.url
}
pub fn set_url(&mut self, url: Option<IriBuf>) {
self.url = url
}
}
impl JsonLdDocument {
#[cfg(feature = "serde")]
pub fn try_into_context_document(
self,
) -> Result<JsonLdContextDocument, crate::syntax::serde::DeserializeError> {
Ok(JsonLdContextDocument {
url: self.url,
content_type: self.content_type,
context_url: self.context_url,
profile: self.profile,
source: self.source,
document: crate::syntax::from_value(self.document)?,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct JsonLdSourceCode {
pub text: String,
pub code_map: JsonCodeMap,
}
impl JsonLdSourceCode {
pub fn new(text: String, code_map: JsonCodeMap) -> Self {
Self { text, code_map }
}
pub fn from_value(value: &JsonValue) -> Self {
JsonLdSourceCode {
text: value.pretty_print().to_string(),
code_map: JsonCodeMap::from_value(value, &JsonPrintOptions::PRETTY),
}
}
}