use json_syntax::{JsonParse, JsonValue};
use rdf_syntax::{Iri, IriBuf};
use std::path::PathBuf;
use crate::{JsonLdDocument, JsonLdLoadError, JsonLdSourceCode};
use super::{AsyncJsonLdLoader, JsonLdFsLoader};
pub use super::fs::Error;
pub struct JsonLdTokioFsLoader(JsonLdFsLoader);
impl Default for JsonLdTokioFsLoader {
fn default() -> Self {
Self(JsonLdFsLoader::default())
}
}
impl JsonLdTokioFsLoader {
pub fn new() -> Self {
Self::default()
}
pub fn mount<P: AsRef<std::path::Path>>(&mut self, url: IriBuf, path: P) {
self.0.mount(url, path)
}
pub fn filepath(&self, url: &Iri) -> Option<PathBuf> {
self.0.filepath(url)
}
}
impl AsyncJsonLdLoader for JsonLdTokioFsLoader {
async fn async_load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
match self.filepath(url) {
Some(filepath) => {
let contents = tokio::fs::read_to_string(&filepath)
.await
.map_err(|e| JsonLdLoadError::new(url.to_owned(), Error::IO(e)))?;
let (doc, code_map) = JsonValue::parse_str(&contents)
.map_err(|e| JsonLdLoadError::new(url.to_owned(), Error::Parse(e)))?;
Ok(JsonLdDocument::new_full(
Some(url.to_owned()),
Some("application/ld+json".parse().unwrap()),
None,
Default::default(),
Some(JsonLdSourceCode::new(contents, code_map)),
doc,
))
}
None => Err(JsonLdLoadError::new(url.to_owned(), Error::NoMountPoint)),
}
}
}