greentic_bundle/cli/
build.rs1use std::path::PathBuf;
2
3use anyhow::Result;
4use clap::Args;
5
6#[derive(Debug, Args)]
7pub struct BuildArgs {
8 #[arg(long, default_value = ".", help = "cli.build.root.option")]
9 pub root: PathBuf,
10
11 #[arg(long, value_name = "FILE", help = "cli.build.output.option")]
12 pub output: Option<PathBuf>,
13
14 #[arg(long, default_value_t = false, help = "cli.option.dry_run")]
15 pub dry_run: bool,
16
17 #[arg(long, default_value_t = false)]
22 pub warmup: bool,
23
24 #[command(flatten)]
25 pub signing: SigningArgs,
26}
27
28#[derive(Debug, Default, Args, Clone)]
31pub struct SigningArgs {
32 #[arg(long, value_name = "FILE")]
35 pub signing_key: Option<PathBuf>,
36
37 #[arg(long, value_name = "HEX", requires = "signing_key")]
44 pub key_id: Option<String>,
45
46 #[arg(long, value_name = "ID", requires = "signing_key")]
52 pub builder_id: Option<String>,
53
54 #[arg(long, value_name = "FILE", requires = "signing_key")]
56 pub signature_output: Option<PathBuf>,
57}
58
59impl SigningArgs {
60 pub fn to_config(&self) -> Option<crate::build::signing::SigningConfig> {
62 self.signing_key
63 .as_ref()
64 .map(|path| crate::build::signing::SigningConfig {
65 signing_key_path: path.clone(),
66 key_id_override: self.key_id.clone(),
67 builder_id: self.builder_id.clone(),
68 signature_path_override: self.signature_output.clone(),
69 })
70 }
71}
72
73impl Default for BuildArgs {
74 fn default() -> Self {
75 Self {
76 root: PathBuf::from("."),
77 output: None,
78 dry_run: false,
79 warmup: false,
80 signing: SigningArgs::default(),
81 }
82 }
83}
84
85pub fn run(args: BuildArgs) -> Result<()> {
86 let signing = args.signing.to_config();
87 let result = crate::build::build_workspace(
88 &args.root,
89 args.output.as_deref(),
90 args.dry_run,
91 args.warmup,
92 signing.as_ref(),
93 )?;
94 println!("{}", serde_json::to_string_pretty(&result)?);
95 Ok(())
96}