use indexmap::IndexMap;
#[cfg(test)]
mod tests;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Arguments(IndexMap<String, Option<String>>);
impl Arguments {
pub fn new() -> Self {
Arguments(IndexMap::new())
}
pub fn set_argument(&mut self, argument: impl Into<String>) {
self.0.insert(argument.into(), None);
}
pub fn set_parameter(&mut self, parameter: impl Into<String>, value: impl Into<String>) {
self.0.insert(parameter.into(), Some(value.into()));
}
pub fn merge_with(&mut self, extra_arguments: Arguments) {
for (key, value) in extra_arguments.0 {
self.0.insert(key, value);
}
}
pub fn into_arguments(self) -> impl Iterator<Item = String> {
self.0
.into_iter()
.flat_map(|(key, value)| Some(key).into_iter().chain(value))
}
}
#[macro_export]
macro_rules! args {
( @started $args:ident $(,)* ) => {};
(
@started $args:ident
$parameter:tt : $argument:expr $(,)*
) => {
$args.set_parameter($parameter, $argument);
};
(
@started $args:ident
$argument:expr $(,)*
) => {
$args.set_argument($argument);
};
(
@started $args:ident
$parameter:tt : $argument:expr
, $( $remaining_arguments:tt )+
) => {
$args.set_parameter($parameter, $argument);
args!(@started $args $( $remaining_arguments )*)
};
(
@started $args:ident
$argument:expr
, $( $remaining_arguments:tt )*
) => {
$args.set_argument($argument);
args!(@started $args $( $remaining_arguments )*)
};
( $( $arguments:tt )* ) => {
{
let mut args = $crate::command::Arguments::new();
args!(@started args $( $arguments )*);
args
}
};
}