use super::disk::read_verified_cache_blob;
use super::fingerprint::PipelineFingerprint;
use super::store::PipelineCacheStore;
pub struct RemoteCache {
base_url: String,
agent: ureq::Agent,
}
impl RemoteCache {
#[must_use]
pub fn new(base_url: impl Into<String>) -> Self {
Self {
base_url: base_url.into(),
agent: ureq::Agent::new_with_defaults(),
}
}
}
impl PipelineCacheStore for RemoteCache {
fn get(&self, fp: &PipelineFingerprint) -> Option<Vec<u8>> {
let url = format!("{}/{}.bin", self.base_url.trim_end_matches('/'), fp.hex());
let mut resp = self.agent.get(&url).call().ok()?;
read_verified_cache_blob(resp.body_mut().as_reader())
}
fn put(&self, _fp: PipelineFingerprint, _artifact: Vec<u8>) {
}
}
#[cfg(test)]
mod tests {
use super::RemoteCache;
#[test]
fn remote_cache_owns_reusable_http_agent() {
let cache = RemoteCache::new("https://cache.invalid/root/");
assert_eq!(cache.base_url, "https://cache.invalid/root/");
let _shared_agent = cache.agent.clone();
}
}