CLI help & empty commands

master
Araozu 2023-12-13 06:12:13 -05:00
parent 09c267139d
commit 6c774f960a
4 changed files with 63 additions and 4 deletions

View File

@ -0,0 +1,46 @@
use crate::cli::{get_help_text, get_version};
use colored::*;
#[derive(Eq, PartialEq, Hash)]
enum EmptyOptions {
Help,
Version,
}
pub fn empty_command(options: &Vec<String>) {
// Add all options to a set
let mut options_set = std::collections::HashSet::new();
for option in options {
match expand_option(option) {
Ok(o) => {
options_set.insert(o);
}
Err(invalid_option) => {
println!("{}", get_help_text());
println!("{}: invalid option: `{}`", "error".on_red(), invalid_option);
return;
}
};
}
let options = options_set;
if options.is_empty() {
println!("{}", get_help_text());
} else {
if options.contains(&EmptyOptions::Version) {
println!("{}\n", get_version());
}
if options.contains(&EmptyOptions::Help) {
println!("{}", get_help_text());
}
}
}
fn expand_option(option: &String) -> Result<EmptyOptions, String> {
match option.as_str() {
"-h" | "--help" => Ok(EmptyOptions::Help),
"-v" | "--version" => Ok(EmptyOptions::Version),
_ => Err(option.clone()),
}
}

View File

@ -5,6 +5,10 @@ pub fn help_command(options: &Vec<String>) {
println!("{}", get_help_text()); println!("{}", get_help_text());
if options.len() > 0 { if options.len() > 0 {
println!("{}: {}", "warning".yellow(), "The help command doesn't take any options."); println!(
"{}: {}",
"warning".yellow(),
"The help command doesn't take any options."
);
} }
} }

View File

@ -1,6 +1,6 @@
mod empty;
mod help; mod help;
mod types; mod types;
mod empty;
use types::{Command, CommandType}; use types::{Command, CommandType};
@ -27,6 +27,7 @@ Commands
General options General options
-h, --help Print command-specific usage -h, --help Print command-specific usage
-v, --version Print version & exit
"#, "#,
"_file_".green() "_file_".green()
) )
@ -55,18 +56,25 @@ fn parse_args() -> Result<Command, String> {
args.remove(0); args.remove(0);
let mut args = args.into_iter(); let mut args = args.into_iter();
let mut options = Vec::new();
let command = match args.next() { let command = match args.next() {
Some(command) if !command.starts_with('-') => Some(command), Some(command) if !command.starts_with('-') => Some(command),
Some(option) => {
options.push(option);
None
}
_ => None, _ => None,
}; };
let mut options = Vec::new();
for arg in args { for arg in args {
if arg.starts_with('-') { if arg.starts_with('-') {
options.push(arg); options.push(arg);
} else { } else {
return Err(format!("Unexpected command `{}` after the options", arg)); return Err(format!(
"Unexpected command `{}`. There can only be one command",
arg
));
} }
} }

View File

@ -27,6 +27,7 @@ impl CommandType {
pub fn run(&self, options: &Vec<String>) { pub fn run(&self, options: &Vec<String>) {
match self { match self {
CommandType::Help => super::help::help_command(options), CommandType::Help => super::help::help_command(options),
CommandType::None => super::empty::empty_command(options),
_ => { _ => {
println!("Not implemented yet! {:?} {:?}", self, options); println!("Not implemented yet! {:?} {:?}", self, options);
} }