use clap::{Command, arg};
mod add;
mod apply;
mod backup;
mod config;
mod console;
mod delete;
mod gen_autocomplete;
mod gen_man;
pub(crate) mod get;
mod log;
mod migrate;
mod power;
mod restore;
mod run;
mod upgrade;
const CLI_TERM_WIDTH: usize = 100;
pub(super) const HOSTLIST_HELP: &str = "Xnames, NIDs, or a hostlist expression.\n\
eg: 'x1003c1s7b0n0,x1003c1s7b0n1', 'nid001313,nid001314',\n\
'x1003c1s7b0n[0-1],x1003c1s7b1n0', 'nid00131[0-9]'";
pub(super) fn output_flag() -> clap::Arg {
arg!(-o --output <FORMAT> "Output format")
.value_parser(["table", "json"])
.default_value("table")
}
pub(super) fn output_flag_long_only() -> clap::Arg {
arg!(--output <FORMAT> "Output format")
.value_parser(["table", "json"])
.default_value("table")
}
pub fn build_cli() -> Command {
Command::new("manta")
.term_width(CLI_TERM_WIDTH)
.version(env!("CARGO_PKG_VERSION"))
.arg_required_else_help(true)
.arg(
arg!(--site <SITE_NAME> "Override the active site for this invocation")
.required(false),
)
.subcommand(config::subcommand_config())
.subcommand(get::subcommand_get())
.subcommand(add::subcommand_add())
.subcommand(apply::subcommand_apply())
.subcommand(delete::subcommand_delete())
.subcommand(migrate::subcommand_migrate())
.subcommand(backup::subcommand_backup())
.subcommand(restore::subcommand_restore())
.subcommand(run::subcommand_run())
.subcommand(power::subcommand_power())
.subcommand(log::subcommand_log())
.subcommand(console::subcommand_console())
.subcommand(gen_autocomplete::subcommand_gen_autocomplete())
.subcommand(gen_man::subcommand_gen_man())
.subcommand(upgrade::subcommand_upgrade())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn site_flag_is_optional() {
let _matches =
build_cli().try_get_matches_from(["manta", "get", "sessions", "--help"]);
let result = build_cli().try_get_matches_from(["manta", "--version"]);
assert!(
result.is_err(),
"expected DisplayVersion error for --version"
);
}
#[test]
fn site_flag_accepted_before_subcommand() {
let result = build_cli()
.try_get_matches_from(["manta", "--site", "alps", "get", "--help"]);
match result {
Err(e) => assert_eq!(
e.kind(),
clap::error::ErrorKind::DisplayHelp,
"expected DisplayHelp, got: {e}"
),
Ok(_) => panic!("--help should cause an early exit"),
}
}
#[test]
fn site_flag_value_is_extractable() {
let matches = build_cli()
.get_matches_from(["manta", "--site", "prealps", "config", "show"]);
let site = matches.get_one::<String>("site");
assert_eq!(site.map(String::as_str), Some("prealps"));
}
#[test]
fn site_flag_absent_returns_none() {
let matches = build_cli().get_matches_from(["manta", "config", "show"]);
let site = matches.get_one::<String>("site");
assert!(site.is_none());
}
#[test]
fn site_flag_is_root_level_only() {
let matches = build_cli()
.get_matches_from(["manta", "--site", "alps", "config", "show"]);
let site = matches.get_one::<String>("site");
assert_eq!(site.map(String::as_str), Some("alps"));
}
}