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 result = crate::wizard::run_interactive(
103                None,
104                None,
105                None,
106                crate::wizard::ExecutionMode::Execute,
107            )?;
108            crate::wizard::print_plan(&result.plan)
109        }
110        Some(WizardCommand::Run(args)) => crate::wizard::run_command(args),
111        Some(WizardCommand::Validate(args)) => crate::wizard::validate_command(args),
112        Some(WizardCommand::Apply(args)) => crate::wizard::apply_command(args),
113    }
114}