Skip to main content

eska_presentation/arguments/build/
mod.rs

1//! Shared native command options and help; execution belongs to eska-build.
2
3use crate::localization::Localizer;
4use clap::{Args, ValueEnum};
5use std::path::PathBuf;
6
7#[derive(Debug, Default, Args)]
8pub struct BuildArgs {
9    #[arg(long)]
10    pub output: Option<PathBuf>,
11
12    #[arg(long)]
13    pub base_configuration: Option<PathBuf>,
14
15    #[arg(long)]
16    pub recreate_infobase: bool,
17
18    #[arg(long)]
19    pub ibcmd: Option<PathBuf>,
20
21    #[arg(long)]
22    pub platform_arch: Option<String>,
23
24    #[arg(long)]
25    pub distrobox: Option<String>,
26
27    #[arg(long, conflicts_with = "select_platform")]
28    pub platform_version: Option<String>,
29
30    #[arg(long, conflicts_with = "platform_version")]
31    pub select_platform: bool,
32
33    #[arg(long, value_enum, default_value_t = OutputFormat::Human)]
34    pub format: OutputFormat,
35
36    #[arg(short = 'p', long)]
37    pub project: Vec<String>,
38
39    #[arg(long)]
40    pub workspace: bool,
41
42    #[command(flatten)]
43    pub mode: BuildModeArgs,
44
45    #[arg(short, long, action = clap::ArgAction::Help)]
46    pub help: Option<bool>,
47}
48
49#[derive(Debug, Default, Args)]
50pub struct BuildModeArgs {
51    #[arg(long)]
52    pub dry_run: bool,
53
54    #[arg(long, conflicts_with = "dry_run")]
55    pub manifest: bool,
56}
57
58#[derive(Clone, Copy, Debug, Default, ValueEnum)]
59pub enum OutputFormat {
60    #[default]
61    Human,
62    Json,
63}
64
65/// Attach localized help to the build command and its arguments.
66pub fn localize(command: clap::Command, localizer: &Localizer) -> clap::Command {
67    command
68        .about(localizer.text("build-about"))
69        .override_usage(localizer.text("build-usage"))
70        .mut_arg("output", |arg| {
71            arg.help(localizer.text("build-output-help"))
72                .value_name(localizer.text("build-output-value"))
73        })
74        .mut_arg("base_configuration", |arg| {
75            arg.help(localizer.text("build-base-configuration-help"))
76                .value_name(localizer.text("build-base-configuration-value"))
77        })
78        .mut_arg("recreate_infobase", |arg| {
79            arg.help(localizer.text("build-recreate-infobase-help"))
80        })
81        .mut_arg("ibcmd", |arg| {
82            arg.help(localizer.text("build-ibcmd-help"))
83                .value_name(localizer.text("build-ibcmd-value"))
84        })
85        .mut_arg("platform_arch", |arg| {
86            arg.help(localizer.text("build-arch-help"))
87                .value_name(localizer.text("build-arch-value"))
88        })
89        .mut_arg("distrobox", |arg| {
90            arg.help(localizer.text("build-distrobox-help"))
91                .value_name(localizer.text("build-distrobox-value"))
92        })
93        .mut_arg("platform_version", |arg| {
94            arg.help(localizer.text("build-platform-version-help"))
95                .value_name(localizer.text("build-platform-version-value"))
96        })
97        .mut_arg("select_platform", |arg| {
98            arg.help(localizer.text("build-select-platform-help"))
99        })
100        .mut_arg("format", |arg| {
101            arg.help(localizer.text("build-format-help"))
102                .value_name(localizer.text("build-format-value"))
103        })
104        .mut_arg("project", |arg| {
105            arg.help(localizer.text("build-project-help"))
106                .value_name(localizer.text("build-project-value"))
107        })
108        .mut_arg("workspace", |arg| {
109            arg.help(localizer.text("build-workspace-help"))
110        })
111        .mut_arg("dry_run", |arg| {
112            arg.help(localizer.text("build-dry-run-help"))
113        })
114        .mut_arg("manifest", |arg| {
115            arg.help(localizer.text("build-manifest-help"))
116        })
117        .mut_arg("help", |arg| arg.help(localizer.text("cli-help")))
118}
119
120impl BuildArgs {
121    /// The shell needs VCS only when execution will actually publish a provenance manifest.
122    #[must_use]
123    pub const fn needs_provenance(&self) -> bool {
124        self.mode.manifest && !self.mode.dry_run
125    }
126}
127
128pub mod artifact;
129pub mod clean;
130pub mod config;
131pub mod import;
132pub mod patch;
133pub mod platform;