json_ld/core/loader/
chain.rs1use core::fmt;
2
3use crate::{JsonLdDocument, JsonLdLoadError};
4use rdf_syntax::Iri;
5
6use super::AsyncJsonLdLoader;
7
8pub struct JsonLdChainLoader<L1, L2>(L1, L2);
17
18impl<L1, L2> JsonLdChainLoader<L1, L2> {
19 pub fn new(l1: L1, l2: L2) -> Self {
21 JsonLdChainLoader(l1, l2)
22 }
23}
24
25impl<L1, L2> AsyncJsonLdLoader for JsonLdChainLoader<L1, L2>
26where
27 L1: AsyncJsonLdLoader,
28 L2: AsyncJsonLdLoader,
29{
30 async fn async_load(&self, url: &Iri) -> Result<JsonLdDocument, JsonLdLoadError> {
31 match self.0.async_load(url).await {
32 Ok(doc) => Ok(doc),
33 Err(JsonLdLoadError { cause: e1, .. }) => match self.1.async_load(url).await {
34 Ok(doc) => Ok(doc),
35 Err(JsonLdLoadError { target, cause: e2 }) => {
36 Err(JsonLdLoadError::new(target, Error(e1, e2)))
37 }
38 },
39 }
40 }
41}
42
43#[derive(Debug)]
45pub struct Error(pub anyhow::Error, pub anyhow::Error);
46
47impl fmt::Display for Error {
48 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
49 let Error(e1, e2) = self;
50 write!(f, "{e1}, then {e2}")
51 }
52}
53
54impl std::error::Error for Error {}