1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use std::path::PathBuf;
use crate::AssetResolver;
/// An asset resolver that chains sub-resolvers together to
/// attempt to resolve a path using multiple ordered methods.
pub struct ResolverChain {
resolvers: Vec<Box<dyn AssetResolver>>,
}
impl ResolverChain {
/// Construct a new resolver chain.
///
/// # Example
/// ```
/// # use asset_resolver::*;
/// let resolver = ResolverChain::new(vec![
/// Box::new(NullResolver),
/// Box::new(DefaultResolver),
/// ]);
/// ```
pub fn new(resolvers: Vec<Box<dyn AssetResolver>>) -> Self {
Self { resolvers }
}
}
impl AssetResolver for ResolverChain {
/// Attempt to resolve a path using the resolvers in the chain.
///
/// # Example
/// ```
/// # use asset_resolver::*;
/// let resolver = ResolverChain::new(vec![
/// Box::new(NullResolver),
/// Box::new(DefaultResolver),
/// ]);
///
/// let path = resolver.resolve("/home/user/assets/test.png").unwrap();
/// assert_eq!(path.to_str().unwrap(), "/home/user/assets/test.png");
/// ```
fn resolve(&self, path: &str) -> Option<PathBuf> {
for resolver in &self.resolvers {
if let Some(path) = resolver.resolve(path) {
return Some(path);
}
}
None
}
}