use crate::error::Error;
use ragit_cli::{ArgParser, ArgType};
#[derive(Clone, Debug)]
pub enum CliCommand {
Run(RunArgs),
DropAll(DropArgs),
TruncateAll(DropArgs),
}
#[derive(Clone, Debug)]
pub struct RunArgs {
pub port_number: Option<u16>,
pub verbose: bool,
pub quiet: bool,
pub config_file: Option<String>,
pub force_default_config: bool,
}
#[derive(Clone, Debug)]
pub struct DropArgs {
pub force: bool,
pub repo_data_dir: Option<String>,
pub blob_data_dir: Option<String>,
}
pub fn parse_cli_args(args: Vec<String>) -> Result<CliCommand, Error> {
match args.get(1).map(|arg| arg.as_str()) {
Some("run") => {
let parsed_args = ArgParser::new()
.optional_flag(&["--verbose", "--quiet"])
.optional_flag(&["--force-default-config"])
.optional_arg_flag("--port", ArgType::integer_between(Some(0), Some(65535)))
.optional_arg_flag("--config", ArgType::String) .short_flag(&["--verbose", "--port"])
.parse(&args, 2)?;
Ok(CliCommand::Run(RunArgs {
port_number: parsed_args.arg_flags.get("--port").map(|n| n.parse::<u16>().unwrap()),
verbose: parsed_args.get_flag(0).unwrap_or(String::new()) == "--verbose",
quiet: parsed_args.get_flag(0).unwrap_or(String::new()) == "--quiet",
config_file: parsed_args.arg_flags.get("--config").map(|f| f.to_string()),
force_default_config: parsed_args.get_flag(1).is_some(),
}))
},
Some(c @ ("drop-all" | "truncate-all")) => {
let parsed_args = ArgParser::new()
.optional_flag(&["--force"])
.optional_arg_flag("--repo-data", ArgType::String) .optional_arg_flag("--blob-data", ArgType::String) .short_flag(&["--force"])
.parse(&args, 2)?;
let args = DropArgs {
force: parsed_args.get_flag(0).is_some(),
repo_data_dir: parsed_args.arg_flags.get("--repo-data").map(|d| d.to_string()),
blob_data_dir: parsed_args.arg_flags.get("--blob-data").map(|d| d.to_string()),
};
Ok(if c == "drop-all" { CliCommand::DropAll(args) } else { CliCommand::TruncateAll(args) })
},
Some(invalid_command) => panic!("invalid command: `{invalid_command}`"),
None => panic!(),
}
}