use super::traits::HostProvider;
use super::wellknown::WellKnownProvider;
#[derive(Debug)]
pub struct ProviderRegistry {
providers: Vec<Box<dyn HostProvider>>,
}
impl Default for ProviderRegistry {
fn default() -> Self {
Self::with_defaults()
}
}
impl ProviderRegistry {
#[must_use]
pub fn with_defaults() -> Self {
let mut reg = Self {
providers: Vec::new(),
};
reg.register(WellKnownProvider);
reg
}
#[must_use]
pub fn empty() -> Self {
Self {
providers: Vec::new(),
}
}
pub fn register(&mut self, provider: impl HostProvider + 'static) {
self.providers.push(Box::new(provider));
}
#[must_use]
pub fn find_match(&self, url: &str) -> Option<(&dyn HostProvider, String)> {
self.providers
.iter()
.find_map(|p| p.matches_url(url).map(|source_id| (p.as_ref(), source_id)))
}
#[must_use]
pub fn providers(&self) -> &[Box<dyn HostProvider>] {
&self.providers
}
}