mannequin/src/nexus/upload.rs
use super::NexusAsset;
use std::collections::HashMap;
use std::sync::Mutex;
/// Upload repo: starts empty, accepts PUT uploads.
pub struct UploadRepo {
assets: Mutex<HashMap<String, Vec<u8>>>,
base_url: String,
}
impl UploadRepo {
pub fn new(base_url: &str) -> Self {
Self {
assets: Mutex::new(HashMap::new()),
base_url: base_url.to_string(),
}
}
pub fn list_assets(&self) -> Vec<NexusAsset> {
self.assets
.lock()
.unwrap()
.iter()
.map(|(path, data)| NexusAsset {
path: path.clone(),
download_url: format!("{}/repository/upload/{}", self.base_url, path),
content_type: Some("application/octet-stream".into()),
size: Some(data.len() as u64),
})
.collect()
}
pub fn download(&self, path: &str) -> Option<Vec<u8>> {
self.assets.lock().unwrap().get(path).cloned()
}
pub fn upload(&self, path: &str, data: Vec<u8>) {
tracing::info!("upload: stored {} ({} bytes)", path, data.len());
self.assets.lock().unwrap().insert(path.to_string(), data);
}
}