read_url/context/
context.rs1use super::super::{cache::*, internal::*, url::*};
2
3use std::{collections::*, path::*, sync::*};
4
5pub type UrlContextRef = Arc<UrlContext>;
11
12#[derive(Clone, Debug)]
14pub struct UrlContext {
15 pub base_urls: Arc<[Arc<UrlRef>]>,
17
18 pub url_overrides: Arc<Mutex<HashMap<String, String>>>,
20
21 pub cache: Arc<UrlCache>,
23
24 pub internal_url_registry: Arc<InternalUrlRegistry>,
26
27 #[cfg(feature = "http")]
33 pub http_client: Arc<LazyLock<reqwest::Client>>,
34}
35
36impl UrlContext {
37 pub fn new() -> UrlContextRef {
39 UrlContext::new_for(None)
40 }
41
42 pub fn new_for(cache_base_directory: Option<PathBuf>) -> UrlContextRef {
44 UrlContext {
45 base_urls: [].into(),
46 url_overrides: Arc::new(HashMap::default().into()),
47 cache: UrlCache::new(cache_base_directory).into(),
48 internal_url_registry: Arc::new(HashMap::default().into()),
49
50 #[cfg(feature = "http")]
51 http_client: Arc::new(LazyLock::new(|| Default::default())),
52 }
53 .into()
54 }
55
56 pub fn with_base_urls<UrlRefT>(self: &UrlContextRef, base_urls: Vec<UrlRefT>) -> UrlContextRef
60 where
61 UrlRefT: Into<Arc<UrlRef>>,
62 {
63 let base_urls: Vec<_> = base_urls.into_iter().map(|url| url.into()).collect();
64
65 UrlContext {
66 base_urls: Arc::from(base_urls),
67 url_overrides: self.url_overrides.clone(),
68 cache: self.cache.clone(),
69 internal_url_registry: self.internal_url_registry.clone(),
70
71 #[cfg(feature = "http")]
72 http_client: self.http_client.clone(),
73 }
74 .into()
75 }
76
77 pub fn with_cache(self: &UrlContextRef, cache_base_directory: Option<PathBuf>) -> UrlContextRef {
81 UrlContext {
82 base_urls: self.base_urls.clone(),
83 url_overrides: self.url_overrides.clone(),
84 cache: UrlCache::new(cache_base_directory).into(),
85 internal_url_registry: self.internal_url_registry.clone(),
86
87 #[cfg(feature = "http")]
88 http_client: self.http_client.clone(),
89 }
90 .into()
91 }
92
93 pub fn clone_base_urls(&self) -> Vec<Arc<UrlRef>> {
95 self.base_urls.iter().cloned().collect()
96 }
97}