Skip to main content

entrenar/cli/commands/research/
deposit.rs

1//! Research deposit subcommand
2
3use crate::cli::logging::log;
4use crate::cli::LogLevel;
5use crate::config::{ArchiveProviderArg, DepositArgs};
6use crate::research::{ArchiveDeposit, ArchiveProvider, ResearchArtifact};
7
8pub fn run_research_deposit(args: DepositArgs, level: LogLevel) -> Result<(), String> {
9    let provider = match args.provider {
10        ArchiveProviderArg::Zenodo => ArchiveProvider::Zenodo,
11        ArchiveProviderArg::Figshare => ArchiveProvider::Figshare,
12        ArchiveProviderArg::Dryad => ArchiveProvider::Dryad,
13        ArchiveProviderArg::Dataverse => ArchiveProvider::Dataverse,
14    };
15
16    log(level, LogLevel::Normal, &format!("Preparing deposit to: {provider}"));
17
18    // Load artifact
19    let yaml = std::fs::read_to_string(&args.artifact)
20        .map_err(|e| format!("Failed to read artifact: {e}"))?;
21
22    let artifact: ResearchArtifact =
23        serde_yaml::from_str(&yaml).map_err(|e| format!("Failed to parse artifact: {e}"))?;
24
25    let mut deposit = ArchiveDeposit::new(provider, artifact);
26
27    // Add files
28    for file_path in &args.file {
29        let content = std::fs::read_to_string(file_path)
30            .map_err(|e| format!("Failed to read {}: {e}", file_path.display()))?;
31
32        let file_name = file_path
33            .file_name()
34            .and_then(|n| n.to_str())
35            .ok_or_else(|| format!("Invalid file name: {}", file_path.display()))?;
36
37        deposit = deposit.with_text_file(file_name, &content);
38    }
39
40    if args.dry_run {
41        log(level, LogLevel::Normal, "Dry run - deposit validated:");
42        log(level, LogLevel::Normal, &format!("  Provider: {}", deposit.provider));
43        log(level, LogLevel::Normal, &format!("  Title: {}", deposit.metadata.title));
44        log(level, LogLevel::Normal, &format!("  Files: {}", deposit.files.len()));
45        log(level, LogLevel::Verbose, &format!("  Base URL: {}", provider.base_url()));
46    } else {
47        // Note: Actual deposit would require async HTTP client
48        // For now, we just validate the deposit structure
49        log(
50            level,
51            LogLevel::Normal,
52            "Deposit prepared (actual upload requires API token and network access)",
53        );
54        log(
55            level,
56            LogLevel::Normal,
57            &format!("  Provider: {} ({})", deposit.provider, provider.base_url()),
58        );
59        log(level, LogLevel::Normal, &format!("  Files ready: {}", deposit.files.len()));
60    }
61
62    Ok(())
63}