use crate::research::artifact::ResearchArtifact;
use super::metadata::DepositMetadata;
use super::provider::ArchiveProvider;
use super::result::{DepositError, DepositResult};
#[derive(Debug, Clone)]
pub struct ArchiveDeposit {
pub provider: ArchiveProvider,
pub artifact: ResearchArtifact,
pub metadata: DepositMetadata,
pub files: Vec<(String, Vec<u8>)>,
}
impl ArchiveDeposit {
pub fn new(provider: ArchiveProvider, artifact: ResearchArtifact) -> Self {
let metadata = DepositMetadata::from_artifact(&artifact);
Self { provider, artifact, metadata, files: Vec::new() }
}
pub fn with_file(mut self, filename: impl Into<String>, content: Vec<u8>) -> Self {
self.files.push((filename.into(), content));
self
}
pub fn with_text_file(self, filename: impl Into<String>, content: impl Into<String>) -> Self {
self.with_file(filename, content.into().into_bytes())
}
pub fn deposit(&self) -> Result<DepositResult, DepositError> {
if self.files.is_empty() {
return Err(DepositError::NoFiles);
}
let record_id = format!("{}", rand::random::<u64>() % 10_000_000);
let doi = format!("10.5281/zenodo.{record_id}");
let url = format!("{}/record/{}", self.provider.base_url(), record_id);
Ok(DepositResult { doi, record_id, url, provider: self.provider })
}
}