macro_rules! declare_and_publish_impl_ {
($mod_name:ident; $($construct_name:ident),*; $vis:vis) => {
mod $mod_name;
$vis use $mod_name::{ $($construct_name),* };
};
}
macro_rules! declare_and_publish {
(crate $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub(crate));
};
(pub $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub);
};
(priv $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub(self));
};
(self $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub(self));
};
(super $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub(super));
};
($mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; pub);
};
($vis:vis $mod_name:ident $(, $construct_name:ident)* $(,)?) => {
$crate::macros::declare_and_publish_impl_!($mod_name; $($construct_name),*; $vis);
};
}
pub(crate) use declare_and_publish;
pub(crate) use declare_and_publish_impl_;