helix/dna/cmd/
publish.rs

1use clap::Args;
2use std::path::PathBuf;
3//use crate::mds::publish::publish_command;
4
5#[derive(Args, Debug)]
6pub struct PublishArgs {
7    /// Action to perform (e.g., publish, sign, export)
8    #[clap(value_parser)]
9    pub action: String,
10
11    /// Optional registry to publish to
12    #[clap(long)]
13    pub registry: Option<String>,
14
15    /// API token for authentication
16    #[clap(long)]
17    pub token: Option<String>,
18
19    /// Perform a dry run without actual publishing
20    #[clap(long)]
21    pub dry_run: bool,
22
23    /// Enable verbose output
24    #[clap(long)]
25    pub verbose: bool,
26
27    /// Suppress output
28    #[clap(long)]
29    pub quiet: bool,
30
31    /// Path to input binary (for sign action)
32    #[clap(long)]
33    pub input: Option<PathBuf>,
34
35    /// Signing key (for sign action)
36    #[clap(long)]
37    pub key: Option<String>,
38
39    /// Output path (for sign/export actions)
40    #[clap(long)]
41    pub output: Option<PathBuf>,
42
43    /// Verify signature (for sign action)
44    #[clap(long)]
45    pub verify: bool,
46
47    /// Export format (for export action)
48    #[clap(long)]
49    pub format: Option<String>,
50
51    /// Include dependencies in export (for export action)
52    #[clap(long)]
53    pub include_deps: bool,
54}
55
56pub fn run(args: PublishArgs) -> anyhow::Result<()> {
57    match args.action.as_str() {
58        "publish" => {
59            crate::mds::publish::publish_project(
60                args.registry,
61                args.token,
62                args.dry_run,
63                args.verbose,
64            )?;
65        }
66        "sign" => {
67            let input = args.input.clone().ok_or_else(|| anyhow::anyhow!("--input is required for sign action"))?;
68            crate::mds::publish::sign_binary(
69                input,
70                args.key.clone(),
71                args.output.clone(),
72                args.verify,
73                args.verbose,
74            )?;
75        }
76        "export" => {
77            let format = args.format.clone().ok_or_else(|| anyhow::anyhow!("--format is required for export action"))?;
78            crate::mds::publish::export_project(
79                format,
80                args.output.clone(),
81                args.include_deps,
82                args.verbose,
83            )?;
84        }
85        _ => {
86            return Err(anyhow::anyhow!("Unknown publish action: {}", args.action));
87        }
88    }
89    Ok(())
90}