macro_rules! import_utility {
($feature:literal => $module:path) => {
#[cfg(feature = $feature)]
pub use $module;
};
}
macro_rules! declare_utility {
($($feature:literal => $module:path as $name:ident),*) => {
$(crate::macros::import_utility!($feature => $module);)*
crate::macros::define_coreutil!($($feature => $module as $name),*);
crate::macros::impl_coreutil!($($feature => $module as $name),*);
}
}
macro_rules! define_coreutil {
($($feature:literal => $module:path as $name:ident),*) => {
#[derive(Parser, Clone, Debug)]
#[allow(missing_docs)]
pub enum Coreutil {
$(
#[cfg(feature = $feature)]
$name($module)
),*
}
}
}
macro_rules! impl_coreutil {
($($feature:literal => $module:path as $name:ident),*) => {
impl Coreutil {
fn runnable(&self) -> &dyn Runnable {
use Coreutil::*;
match self {
$(
#[cfg(feature = $feature)]
$name(args) => args
),*
}
}
fn parse(binary: &str) -> Option<Self> {
use Coreutil::*;
match binary {
$(
$feature => Some($name(<$module>::parse())),
)*
_ => None,
}
}
}
}
}
pub(crate) use declare_utility;
pub(crate) use define_coreutil;
pub(crate) use impl_coreutil;
pub(crate) use import_utility;