entrenar/research/archive/
deposit.rs1use crate::research::artifact::ResearchArtifact;
4
5use super::metadata::DepositMetadata;
6use super::provider::ArchiveProvider;
7use super::result::{DepositError, DepositResult};
8
9#[derive(Debug, Clone)]
11pub struct ArchiveDeposit {
12 pub provider: ArchiveProvider,
14 pub artifact: ResearchArtifact,
16 pub metadata: DepositMetadata,
18 pub files: Vec<(String, Vec<u8>)>,
20}
21
22impl ArchiveDeposit {
23 pub fn new(provider: ArchiveProvider, artifact: ResearchArtifact) -> Self {
25 let metadata = DepositMetadata::from_artifact(&artifact);
26 Self { provider, artifact, metadata, files: Vec::new() }
27 }
28
29 pub fn with_file(mut self, filename: impl Into<String>, content: Vec<u8>) -> Self {
31 self.files.push((filename.into(), content));
32 self
33 }
34
35 pub fn with_text_file(self, filename: impl Into<String>, content: impl Into<String>) -> Self {
37 self.with_file(filename, content.into().into_bytes())
38 }
39
40 pub fn deposit(&self) -> Result<DepositResult, DepositError> {
42 if self.files.is_empty() {
47 return Err(DepositError::NoFiles);
48 }
49
50 let record_id = format!("{}", rand::random::<u64>() % 10_000_000);
52 let doi = format!("10.5281/zenodo.{record_id}");
53
54 let url = format!("{}/record/{}", self.provider.base_url(), record_id);
55
56 Ok(DepositResult { doi, record_id, url, provider: self.provider })
57 }
58}