Skip to main content

entrenar/research/archive/
deposit.rs

1//! Archive deposit functionality.
2
3use crate::research::artifact::ResearchArtifact;
4
5use super::metadata::DepositMetadata;
6use super::provider::ArchiveProvider;
7use super::result::{DepositError, DepositResult};
8
9/// Archive deposit request
10#[derive(Debug, Clone)]
11pub struct ArchiveDeposit {
12    /// Archive provider
13    pub provider: ArchiveProvider,
14    /// Artifact to deposit
15    pub artifact: ResearchArtifact,
16    /// Deposit metadata
17    pub metadata: DepositMetadata,
18    /// Files to upload (path -> content)
19    pub files: Vec<(String, Vec<u8>)>,
20}
21
22impl ArchiveDeposit {
23    /// Create a new deposit
24    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    /// Add a file to upload
30    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    /// Add a text file
36    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    /// Perform deposit (mock implementation for testing)
41    pub fn deposit(&self) -> Result<DepositResult, DepositError> {
42        // This is a mock implementation - real implementation would use HTTP client
43        // to interact with the archive's API
44
45        // Validate we have at least one file
46        if self.files.is_empty() {
47            return Err(DepositError::NoFiles);
48        }
49
50        // Generate mock DOI and record ID
51        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}