#[macro_export]
macro_rules! flag {
(-$short_name:tt) => {
$crate::flag::has_short_name_flag(std::env::args().into_iter(), stringify!($short_name))
};
(--$long_name:tt) => {
$crate::flag::has_long_name_flag(std::env::args().into_iter(), stringify!($long_name))
};
(let -$short_name:tt) => {
let $short_name: bool = $crate::flag!(-$short_name);
};
(let --$long_name:tt) => {
let $long_name: bool = $crate::flag!(--$long_name);
};
(-$short_name:tt, --$long_name:tt) => {
$crate::flag!(-$short_name) || $crate::flag!(--$long_name)
};
(-$short_name:tt, $args:ident) => {
$crate::flag::has_short_name_flag(
(&$args).into_iter().map(|a| a.to_string()),
stringify!($short_name),
)
};
(--$long_name:tt, $args:ident) => {
$crate::flag::has_long_name_flag(
(&$args).into_iter().map(|a| a.to_string()),
stringify!($long_name),
)
};
(let -$short_name:tt, $args:ident) => {
let $short_name: bool = $crate::flag!(-$short_name, $args);
};
(let --$long_name:tt, $args:ident) => {
let $long_name: bool = $crate::flag!(--$long_name, $args);
};
(-$short_name:tt, --$long_name:tt, $args:ident) => {
$crate::flag!(-$short_name, $args) || $crate::flag!(--$long_name, $args)
};
}
pub fn has_short_name_flag(args: impl Iterator<Item = String>, name: &str) -> bool {
args.skip(1)
.find(|s| {
s.chars().nth(0) == Some('-') && s.chars().nth(1) != Some('-') && s.contains(&name)
})
.is_some()
}
pub fn has_long_name_flag(args: impl Iterator<Item = String>, name: &str) -> bool {
args.skip(1)
.find(|s| **s == format!("--{}", name.replace('_', "-")))
.is_some()
}