Skip to main content

greentic_bundle/cli/
wizard.rs

1use std::path::PathBuf;
2
3use anyhow::Result;
4use clap::{Args, Subcommand, ValueEnum};
5
6#[derive(Debug, Args)]
7pub struct WizardArgs {
8    #[command(subcommand)]
9    pub command: Option<WizardCommand>,
10}
11
12#[derive(Debug, Subcommand)]
13pub enum WizardCommand {
14    #[command(about = "cli.wizard.run.about")]
15    Run(WizardRunArgs),
16    #[command(about = "cli.wizard.validate.about")]
17    Validate(WizardValidateArgs),
18    #[command(about = "cli.wizard.apply.about")]
19    Apply(WizardApplyArgs),
20}
21
22#[derive(Debug, Clone, Copy, ValueEnum, PartialEq, Eq)]
23pub enum WizardMode {
24    Create,
25    Update,
26    Doctor,
27}
28
29#[derive(Debug, Args, Default)]
30pub struct WizardRunArgs {
31    #[arg(long, value_name = "FILE", help = "cli.option.answers")]
32    pub answers: Option<PathBuf>,
33    #[arg(
34        long = "emit-answers",
35        value_name = "FILE",
36        help = "cli.option.emit_answers"
37    )]
38    pub emit_answers: Option<PathBuf>,
39    #[arg(
40        long = "schema-version",
41        value_name = "VER",
42        help = "cli.option.schema_version"
43    )]
44    pub schema_version: Option<String>,
45    #[arg(long, default_value_t = false, help = "cli.option.migrate")]
46    pub migrate: bool,
47    #[arg(long, default_value_t = false, help = "cli.option.dry_run")]
48    pub dry_run: bool,
49    #[arg(long, value_enum, help = "cli.wizard.mode.option")]
50    pub mode: Option<WizardMode>,
51}
52
53#[derive(Debug, Args)]
54pub struct WizardValidateArgs {
55    #[arg(long, value_name = "FILE", help = "cli.option.answers")]
56    pub answers: PathBuf,
57    #[arg(
58        long = "emit-answers",
59        value_name = "FILE",
60        help = "cli.option.emit_answers"
61    )]
62    pub emit_answers: Option<PathBuf>,
63    #[arg(
64        long = "schema-version",
65        value_name = "VER",
66        help = "cli.option.schema_version"
67    )]
68    pub schema_version: Option<String>,
69    #[arg(long, default_value_t = false, help = "cli.option.migrate")]
70    pub migrate: bool,
71    #[arg(long, value_enum, help = "cli.wizard.mode.option")]
72    pub mode: Option<WizardMode>,
73}
74
75#[derive(Debug, Args)]
76pub struct WizardApplyArgs {
77    #[arg(long, value_name = "FILE", help = "cli.option.answers")]
78    pub answers: PathBuf,
79    #[arg(
80        long = "emit-answers",
81        value_name = "FILE",
82        help = "cli.option.emit_answers"
83    )]
84    pub emit_answers: Option<PathBuf>,
85    #[arg(
86        long = "schema-version",
87        value_name = "VER",
88        help = "cli.option.schema_version"
89    )]
90    pub schema_version: Option<String>,
91    #[arg(long, default_value_t = false, help = "cli.option.migrate")]
92    pub migrate: bool,
93    #[arg(long, default_value_t = false, help = "cli.option.dry_run")]
94    pub dry_run: bool,
95    #[arg(long, value_enum, help = "cli.wizard.mode.option")]
96    pub mode: Option<WizardMode>,
97}
98
99pub fn run(args: WizardArgs) -> Result<()> {
100    match args.command {
101        None => {
102            let zero_action = embedded_root_zero_action();
103            let Some(result) = crate::wizard::run_interactive_with_zero_action(
104                None,
105                None,
106                None,
107                crate::wizard::ExecutionMode::Execute,
108                zero_action,
109            )?
110            else {
111                return Ok(());
112            };
113            crate::wizard::print_plan(&result.plan)
114        }
115        Some(WizardCommand::Run(args)) => crate::wizard::run_command(args),
116        Some(WizardCommand::Validate(args)) => crate::wizard::validate_command(args),
117        Some(WizardCommand::Apply(args)) => crate::wizard::apply_command(args),
118    }
119}
120
121fn embedded_root_zero_action() -> crate::wizard::RootMenuZeroAction {
122    match std::env::var("GREENTIC_WIZARD_ROOT_ZERO_ACTION")
123        .ok()
124        .as_deref()
125    {
126        Some("back") => crate::wizard::RootMenuZeroAction::Back,
127        _ => crate::wizard::RootMenuZeroAction::Exit,
128    }
129}