Skip to main content

codanna/cli/commands/
plugin.rs

1//! Plugin management command.
2
3use crate::cli::PluginAction;
4use crate::config::Settings;
5use crate::plugins;
6
7/// Run plugin management command.
8pub fn run(action: PluginAction, config: &Settings) {
9    let result = match action {
10        PluginAction::Add {
11            marketplace,
12            plugin_name,
13            r#ref,
14            force,
15            dry_run,
16        } => plugins::add_plugin(
17            config,
18            &marketplace,
19            &plugin_name,
20            r#ref.as_deref(),
21            force,
22            dry_run,
23        ),
24        PluginAction::Remove {
25            plugin_name,
26            force,
27            dry_run,
28        } => plugins::remove_plugin(config, &plugin_name, force, dry_run),
29        PluginAction::Update {
30            plugin_name,
31            r#ref,
32            force,
33            dry_run,
34        } => plugins::update_plugin(config, &plugin_name, r#ref.as_deref(), force, dry_run),
35        PluginAction::List { verbose, json } => plugins::list_plugins(config, verbose, json),
36        PluginAction::Verify {
37            plugin_name,
38            all,
39            verbose,
40        } => {
41            if all {
42                plugins::verify_all_plugins(config, verbose)
43            } else {
44                match plugin_name {
45                    Some(name) => plugins::verify_plugin(config, &name, verbose),
46                    None => {
47                        eprintln!("Error: plugin_name is required when --all is not specified");
48                        std::process::exit(1);
49                    }
50                }
51            }
52        }
53    };
54
55    if let Err(e) = result {
56        use crate::io::exit_code::ExitCode;
57        let code: ExitCode = e.exit_code();
58        eprintln!("Plugin operation failed: {e}");
59        std::process::exit(i32::from(code));
60    }
61}