use core::fmt;
use core::fmt::Display;
use std::env;
use colored::Colorize as _;
use once_cell::sync::Lazy;
use crate::{commands::help::format_description, types::CommandArgs};
pub struct Flag<'a> {
pub short: &'a str,
pub long: &'a str,
pub description: &'a str,
}
impl Flag<'_> {
pub fn is_in(&self, args: &CommandArgs) -> bool {
args.contains(self.short) || args.contains(self.long)
}
pub fn extract_from_arg(&self, arg: &str) -> Option<String> {
if arg.starts_with(self.short) {
arg.get(self.short.len()..).map(Into::into)
} else if arg.starts_with(self.long) {
arg.get(self.long.len()..).map(Into::into)
} else {
None
}
}
}
impl Display for Flag<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}{}{}\n {}",
self.short.bright_magenta(),
", ".bright_black(),
self.long.bright_magenta(),
format_description(self.description)
)
}
}
pub fn is_valid_flag(arg: &str, available_flags: &[&Flag]) -> bool {
available_flags
.iter()
.flat_map(|flag| [flag.short, flag.long])
.any(|flag| arg.starts_with(flag))
}
pub static IS_VERBOSE: Lazy<bool> = Lazy::new(|| {
let args: CommandArgs = env::args().collect();
args.contains("--verbose")
});