#[macro_export]
macro_rules! option {
(-$short_name:tt) => {
$crate::option::env_arg_val(format!("-{}", stringify!($short_name)))
};
(--$long_name:tt) => {
$crate::option::env_arg_val(format!("--{}", stringify!($long_name).replace('_', "-")))
};
(let -$short_name:tt) => {
let $short_name: Option<String> = $crate::option!(-$short_name);
};
(let --$long_name:tt) => {
let $long_name: Option<String> = $crate::option!(--$long_name);
};
(-$short_name:tt, --$long_name:tt) => {
$crate::option!(-$short_name).or($crate::option!(--$long_name))
};
(-$short_name:tt, $args:ident) => {
$crate::option::arg_val(format!("-{}", stringify!($short_name)), &$args)
};
(--$long_name:tt, $args:ident) => {
$crate::option::arg_val(
format!("--{}", stringify!($long_name).replace('_', "-")),
&$args,
)
};
(let -$short_name:tt, $args:ident) => {
let $short_name: Option<&str> = $crate::option!(-$short_name, $args);
};
(let --$long_name:tt, $args:ident) => {
let $long_name: Option<&str> = $crate::option!(--$long_name, $args);
};
(-$short_name:tt, --$long_name:tt, $args:ident) => {
$crate::option!(-$short_name, $args).or($crate::option!(--$long_name, $args))
};
}
pub fn env_arg_val(name: String) -> Option<String> {
let mut iter = std::env::args().into_iter().skip(1);
iter.position(|arg| arg == name).and_then(|_| iter.next())
}
pub fn arg_val<'a>(name: String, args: &[&'a str]) -> Option<&'a str> {
let mut iter = args.into_iter().skip(1);
iter.position(|&arg| arg == name)
.and_then(|_| iter.next().map(|&a| a))
}