entrenar/cli/commands/research/
deposit.rs1use 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 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 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 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}