Skip to main content

eska_presentation/arguments/project/
version.rs

1//! Shared project command options and help; metadata and transactions stay with their owner.
2
3use crate::localization::Localizer;
4use clap::{Args, Subcommand, ValueEnum};
5use eska_project_core::project::version::BumpKind;
6
7#[derive(Debug, Args)]
8pub struct VersionArgs {
9    #[command(subcommand)]
10    pub command: Option<VersionCommand>,
11
12    #[arg(long, global = true, value_enum, default_value_t = OutputFormat::Human)]
13    pub format: OutputFormat,
14
15    #[arg(short = 'p', long, global = true)]
16    pub project: Vec<String>,
17
18    #[arg(long, global = true)]
19    pub workspace: bool,
20
21    #[arg(short, long, action = clap::ArgAction::Help)]
22    pub help: Option<bool>,
23}
24
25#[derive(Debug, Subcommand)]
26pub enum VersionCommand {
27    #[command(disable_help_flag = true)]
28    Bump(VersionBumpArgs),
29}
30
31#[derive(Debug, Args)]
32pub struct VersionBumpArgs {
33    #[arg(value_enum)]
34    pub kind: Bump,
35
36    #[arg(short, long, action = clap::ArgAction::Help)]
37    pub help: Option<bool>,
38}
39
40#[derive(Clone, Copy, Debug, ValueEnum)]
41pub enum Bump {
42    Patch,
43    Minor,
44    Major,
45}
46
47#[derive(Clone, Copy, Debug, Default, ValueEnum)]
48pub enum OutputFormat {
49    #[default]
50    Human,
51    Json,
52}
53
54/// Render localized help for the command and its mutating subcommand.
55#[must_use]
56pub fn localize(command: clap::Command, localizer: &Localizer) -> clap::Command {
57    command
58        .about(localizer.text("version-about"))
59        .override_usage(localizer.text("version-usage"))
60        .mut_arg("format", |argument| {
61            argument
62                .help(localizer.text("version-format-help"))
63                .value_name(localizer.text("version-format-value"))
64        })
65        .mut_arg("project", |argument| {
66            argument
67                .help(localizer.text("version-project-help"))
68                .value_name(localizer.text("version-project-value"))
69        })
70        .mut_arg("workspace", |argument| {
71            argument.help(localizer.text("version-workspace-help"))
72        })
73        .mut_arg("help", |argument| argument.help(localizer.text("cli-help")))
74        .mut_subcommand("bump", |command| {
75            command
76                .about(localizer.text("version-bump-about"))
77                .override_usage(localizer.text("version-bump-usage"))
78                .mut_arg("kind", |argument| {
79                    argument
80                        .help(localizer.text("version-bump-kind-help"))
81                        .value_name(localizer.text("version-bump-kind-value"))
82                })
83                .mut_arg("help", |argument| argument.help(localizer.text("cli-help")))
84        })
85}
86
87impl From<Bump> for BumpKind {
88    /// Keep clap-specific values out of the project layer.
89    fn from(value: Bump) -> Self {
90        match value {
91            Bump::Patch => Self::Patch,
92            Bump::Minor => Self::Minor,
93            Bump::Major => Self::Major,
94        }
95    }
96}