Skip to main content

json_ld/core/loader/
map.rs

1use rdf_syntax::{Iri, IriBuf};
2use std::{
3	collections::{BTreeMap, HashMap},
4	sync::LazyLock,
5};
6
7use crate::{JsonLdDocument, JsonLdLoadError};
8
9use super::{AsyncJsonLdLoader, JsonLdLoader};
10
11/// Lazily initialized map of pre-loaded documents, suitable for a `static`.
12///
13/// It implements [`JsonLdLoader`] and [`AsyncJsonLdLoader`], and `&StaticJsonLdLoader`
14/// can be used wherever a loader is expected.
15///
16/// ```
17/// use json_ld::{AsyncJsonLdLoader, StaticJsonLdLoader};
18/// use std::{collections::HashMap, sync::LazyLock};
19///
20/// static LOADER: StaticJsonLdLoader = LazyLock::new(HashMap::new);
21/// # fn is_loader(_: &impl AsyncJsonLdLoader) {}
22/// # is_loader(&LOADER);
23/// ```
24pub type StaticJsonLdLoader = LazyLock<HashMap<IriBuf, JsonLdDocument>>;
25
26/// Error returned using [`HashMap`] or [`BTreeMap`] as a [`JsonLdLoader`] with the
27/// requested document is not found.
28#[derive(Debug, thiserror::Error)]
29#[error("document not found")]
30pub struct EntryNotFound;
31
32impl JsonLdLoader for HashMap<IriBuf, JsonLdDocument> {
33	fn load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
34		match self.get(url) {
35			Some(document) => Ok(document.clone()),
36			None => Err(JsonLdLoadError::new(url.to_owned(), EntryNotFound)),
37		}
38	}
39}
40
41impl AsyncJsonLdLoader for HashMap<IriBuf, JsonLdDocument> {
42	async fn async_load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
43		match self.get(url) {
44			Some(document) => Ok(document.clone()),
45			None => Err(JsonLdLoadError::new(url.to_owned(), EntryNotFound)),
46		}
47	}
48}
49
50impl JsonLdLoader for BTreeMap<IriBuf, JsonLdDocument> {
51	fn load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
52		match self.get(url) {
53			Some(document) => Ok(document.clone()),
54			None => Err(JsonLdLoadError::new(url.to_owned(), EntryNotFound)),
55		}
56	}
57}
58
59impl AsyncJsonLdLoader for BTreeMap<IriBuf, JsonLdDocument> {
60	async fn async_load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
61		match self.get(url) {
62			Some(document) => Ok(document.clone()),
63			None => Err(JsonLdLoadError::new(url.to_owned(), EntryNotFound)),
64		}
65	}
66}