xsd_parser/parser/resolver/
many_resolver.rsuse std::error::Error as StdError;
use std::io::BufRead;
use anyhow::Error;
use url::Url;
use super::{ResolveRequest, Resolver};
#[derive(Default, Debug)]
pub struct ManyResolver {
resolvers: Vec<Box<dyn Resolver<Buffer = BoxedBuffer, Error = Error>>>,
}
type BoxedBuffer = Box<dyn BufRead + 'static>;
#[derive(Debug)]
#[must_use]
struct MappedResolver<T>(T);
impl ManyResolver {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn add_resolver<R>(mut self, resolver: R) -> Self
where
R: Resolver + 'static,
R::Buffer: BufRead + 'static,
R::Error: StdError + Send + Sync + 'static,
{
self.resolvers.push(Box::new(MappedResolver(resolver)));
self
}
}
impl Resolver for ManyResolver {
type Buffer = BoxedBuffer;
type Error = Error;
fn resolve(
&mut self,
req: &ResolveRequest,
) -> Result<Option<(Url, Self::Buffer)>, Self::Error> {
for resolver in self.resolvers.iter_mut() {
if let Some((location, buffer)) = resolver.resolve(req)? {
return Ok(Some((location, buffer)));
}
}
Ok(None)
}
}
impl<R> Resolver for MappedResolver<R>
where
R: Resolver + 'static,
R::Buffer: BufRead + 'static,
R::Error: StdError + Send + Sync + 'static,
{
type Buffer = BoxedBuffer;
type Error = Error;
fn resolve(
&mut self,
req: &ResolveRequest,
) -> Result<Option<(Url, Self::Buffer)>, Self::Error> {
match self.0.resolve(req) {
Ok(Some((location, buffer))) => Ok(Some((location, Box::new(buffer)))),
Ok(None) => Ok(None),
Err(error) => Err(Error::from(error)),
}
}
}