greentic_bundle/cli/
wizard.rs1use 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}