#![feature(const_option_ops)]
#![feature(const_trait_impl)]
#![feature(const_cmp)]
#![allow(macro_expanded_macro_exports_accessed_by_absolute_paths)]
#![allow(clippy::crate_in_macro_def, reason = "clippy bug")]
#![feature(macro_derive)]
#![feature(macro_attr)]
mod as_variant;
mod display;
mod enum_iter;
mod enum_kind;
mod expect_variant;
mod from_str;
mod is_variant;
mod map_variant;
mod unwrap_variant;
mod variant_count;
mod variant_names;
#[doc(hidden)]
pub mod private {
pub use const_format;
}
#[macro_export]
macro_rules! define_extract_macro {
(
// Escaped `$`, same as `$$` which is currently nightly
$_:tt
// the `macro_rules!` to generate
macro_rules! $macro_name:ident;
match ? in #[$helper_attr_name:ident(?)] {
$(
{ $value_ident:ident $($value:tt)* } => { $($captured:tt)* }
)*
}
) => {
#[doc(hidden)]
#[macro_export]
macro_rules! $macro_name {
($_ field:ident: $_ (#[$_ ($_ attr:tt)*])*) => {
$_ (
if let Some(val) = $_ crate::$macro_name!(@ $_ field: $_ ($_ attr)*) {
Some(val)
} else
)* {
None
}
};
(@ $_ field:ident: $helper_attr_name($_ ($_ attr:tt)*)) => { $_ crate::$macro_name!(! $_ field: $_ ($_ attr)*) };
(@ $_ field:ident: $_ ($_ ignore:tt)*) => { None };
$(
(! $value_ident: $value_ident $($value)*, $_ ($_ attr:tt)+) => { Some($($captured)*) };
(! $value_ident: $value_ident $($value)* $_ (,)?) => { Some($($captured)*) };
)*
$(
(! $_ field:ident: $value_ident $($value)*, $_ ($_ attr:tt)+) => { $_ crate::$macro_name!(! $_ field: $_ ($_ attr)+) };
(! $_ field:ident: $value_ident $($value)* $_ (,)?) => { None };
)*
(! $_ field:ident: $_ ignore:ident $_ ($_ attr:tt)*) => {
compile_error!(concat!(
"unexpected token: `",
stringify!($_ ignore),
"`, allowed `#[zenum(/* ... */)]` arguments are:\n",
$(
"• ", "`", stringify!($value_ident $($value)*), "`\n",
)*
))
};
}
};
}
define_extract_macro! {$
macro_rules! extract_field;
match ? in #[zenum(?)] {
{ rename_all = $value:expr } => { $value }
{ disabled } => { () }
{ rename = $value:expr } => { $value }
{ aliases = $value:expr } => { $value }
}
}
#[cfg(false)]
#[doc(hidden)]
#[macro_export]
macro_rules! extract_field {
($field:ident: $(#[$($attr:tt)*])*) => {
$(
// Try to extract from each individual `#[attr]`
if let Some(val) = $crate::extract_field!(@ $field: $($attr)*) {
Some(val)
} else
)* {
None
}
};
(@ $field:ident: zenum($($attr:tt)*)) => { $crate::extract_field!(! $field: $($attr)*) };
(@ $field:ident: $($ignore:tt)*) => { None };
(! rename_all: rename_all = $value:expr, $($attr:tt)+) => { Some($value) };
(! rename_all: rename_all = $value:expr $(,)?) => { Some($value) };
(! disabled: disabled, $($attr:tt)+) => { Some(()) };
(! disabled: disabled $(,)?) => { Some(()) };
(! rename: rename = $value:expr, $($attr:tt)+) => { Some($value) };
(! rename: rename = $value:expr $(,)?) => { Some($value) };
(! aliases: aliases = $value:expr, $($attr:tt)+) => { Some($value) };
(! aliases: aliases = $value:expr $(,)?) => { Some($value) };
(! $field:ident: rename_all = $value:expr, $($attr:tt)+) => { $crate::extract_field!(! $field: $($attr)+) };
(! $field:ident: rename_all = $value:expr $(,)?) => { None };
(! $field:ident: disabled, $($attr:tt)+) => { $crate::extract_field!(! $field: $($attr)*) };
(! $field:ident: disabled $(,)?) => { None };
(! $field:ident: rename = $value:expr, $($attr:tt)+) => { $crate::extract_field!(! $field: $($attr)+) };
(! $field:ident: rename = $value:expr $(,)?) => { None };
(! $field:ident: aliases = $value:expr, $($attr:tt)+) => { $crate::extract_field!(! $field: $($attr)+) };
(! $field:ident: aliases = $value:expr $(,)?) => { None };
(! $field:ident: $ignore:ident $($attr:tt)*) => {
compile_error!(concat!(
"unexpected token: `",
stringify!($ignore),
"`, allowed `#[zenum(/* ... */)]` arguments are:\n",
"• `rename_all = $_:expr`\n",
"• `disabled`\n",
"• `rename = $_:expr`\n"
"• `aliases = $_:expr`\n"
))
};
}
pub use enumwow_helpers::dummy;
#[derive(Debug, PartialEq, FromStr, dummy)]
enum Color {
Red,
Green {
range: usize,
},
Blue(usize),
#[zenum(disabled)]
Yellow,
Black,
}
fn main() {
println!("Hello, world!");
}