use super::error::FetchError;
use crate::error::Result;
use super::{FetchResult, SchemaFetcher};
pub struct CombinedFetcher {
fetchers: Vec<Box<dyn SchemaFetcher>>,
}
impl CombinedFetcher {
pub fn new() -> Self {
Self {
fetchers: Vec::new(),
}
}
pub fn with_fetcher<F: SchemaFetcher + 'static>(mut self, fetcher: F) -> Self {
self.fetchers.push(Box::new(fetcher));
self
}
}
impl Default for CombinedFetcher {
fn default() -> Self {
Self::new()
}
}
impl SchemaFetcher for CombinedFetcher {
fn fetch(&self, url: &str) -> Result<FetchResult> {
let mut last_error = None;
for fetcher in &self.fetchers {
match fetcher.fetch(url) {
Ok(result) => return Ok(result),
Err(e) => last_error = Some(e),
}
}
Err(last_error.unwrap_or_else(|| {
FetchError::RequestFailed {
url: url.to_string(),
message: "No fetchers configured".to_string(),
}
.into()
}))
}
}