use super::super::{cache::*, internal::*, url::*};
use std::{collections::*, path::*, sync::*};
pub type UrlContextRef = Arc<UrlContext>;
#[derive(Clone, Debug)]
pub struct UrlContext {
pub base_urls: Arc<[Arc<UrlRef>]>,
pub url_overrides: Arc<Mutex<HashMap<String, String>>>,
pub cache: Arc<UrlCache>,
pub internal_url_registry: Arc<InternalUrlRegistry>,
#[cfg(feature = "http")]
pub http_client: Arc<LazyLock<reqwest::Client>>,
}
impl UrlContext {
pub fn new() -> UrlContextRef {
UrlContext::new_for(None)
}
pub fn new_for(cache_base_directory: Option<PathBuf>) -> UrlContextRef {
UrlContext {
base_urls: [].into(),
url_overrides: Arc::new(HashMap::default().into()),
cache: UrlCache::new(cache_base_directory).into(),
internal_url_registry: Arc::new(HashMap::default().into()),
#[cfg(feature = "http")]
http_client: Arc::new(LazyLock::new(|| Default::default())),
}
.into()
}
pub fn with_base_urls<UrlRefT>(self: &UrlContextRef, base_urls: Vec<UrlRefT>) -> UrlContextRef
where
UrlRefT: Into<Arc<UrlRef>>,
{
let base_urls: Vec<_> = base_urls.into_iter().map(|url| url.into()).collect();
UrlContext {
base_urls: Arc::from(base_urls),
url_overrides: self.url_overrides.clone(),
cache: self.cache.clone(),
internal_url_registry: self.internal_url_registry.clone(),
#[cfg(feature = "http")]
http_client: self.http_client.clone(),
}
.into()
}
pub fn with_cache(self: &UrlContextRef, cache_base_directory: Option<PathBuf>) -> UrlContextRef {
UrlContext {
base_urls: self.base_urls.clone(),
url_overrides: self.url_overrides.clone(),
cache: UrlCache::new(cache_base_directory).into(),
internal_url_registry: self.internal_url_registry.clone(),
#[cfg(feature = "http")]
http_client: self.http_client.clone(),
}
.into()
}
pub fn clone_base_urls(&self) -> Vec<Arc<UrlRef>> {
self.base_urls.iter().cloned().collect()
}
}