22// Copyright (C) 2026 Maika Namuo
33
44macro_rules! choice_enum {
5- ( @build [ $( $default: ident) ?] $( #[ $attr: meta] ) * $vis: vis enum $name: ident { $( $( #[ $var_attr: meta] ) * $variant: ident => $label: expr) ,+ $( , ) ? } ) => {
5+ ( @parse [ $( $default: ident) ?] [ $( $all: ident) ?] no_default $( $rest: tt) +) => {
6+ $crate:: macros:: choice_enum!( @parse [ ] [ $( $all) ?] $( $rest) +) ;
7+ } ;
8+ ( @parse [ $( $default: ident) ?] [ $( $all: ident) ?] all $( $rest: tt) +) => {
9+ $crate:: macros:: choice_enum!( @parse [ $( $default) ?] [ all] $( $rest) +) ;
10+ } ;
11+ ( @parse [ $( $default: ident) ?] [ $( $all: ident) ?] $( #[ $attr: meta] ) * $vis: vis enum $name: ident { $( $( #[ $var_attr: meta] ) * $variant: ident => $label: expr) ,+ $( , ) ? } ) => {
612 #[ derive( Debug , Clone , Copy , serde:: Serialize , serde:: Deserialize , PartialEq , Eq $( , $default) ?) ]
713 #[ serde( rename_all = "snake_case" ) ]
814 $( #[ $attr] ) *
@@ -15,15 +21,14 @@ macro_rules! choice_enum {
1521 impl std:: fmt:: Display for $name {
1622 fn fmt( & self , f: & mut std:: fmt:: Formatter <' _>) -> std:: fmt:: Result { f. write_str( self . label( ) ) }
1723 }
24+
25+ $crate:: macros:: choice_enum!( @all [ $( $all) ?] $name { $( $variant, ) + } ) ;
1826 } ;
19- ( @build_all [ $ ( $default : ident ) ? ] $( # [ $attr : meta ] ) * $vis : vis enum $name : ident { $ ( $ ( # [ $var_attr : meta ] ) * $variant : ident => $label : expr ) ,+ $ ( , ) ? } ) => {
20- $crate :: macros :: choice_enum! ( @build [ $ ( $default ) ? ] $( # [ $attr ] ) * $vis enum $ name { $( $( # [ $var_attr ] ) * $ variant => $label , ) + } ) ;
27+ ( @all [ ] $( $rest : tt ) * ) => { } ;
28+ ( @all [ all ] $name: ident { $( $variant: ident , ) + } ) => {
2129 impl $name { pub const ALL : & ' static [ Self ] = & [ $( Self :: $variant, ) +] ; }
2230 } ;
23- ( no_default all $( $rest: tt) +) => { $crate:: macros:: choice_enum!( @build_all [ ] $( $rest) +) ; } ;
24- ( all $( $rest: tt) +) => { $crate:: macros:: choice_enum!( @build_all [ Default ] $( $rest) +) ; } ;
25- ( no_default $( $rest: tt) +) => { $crate:: macros:: choice_enum!( @build [ ] $( $rest) +) ; } ;
26- ( $( $rest: tt) +) => { $crate:: macros:: choice_enum!( @build [ Default ] $( $rest) +) ; } ;
31+ ( $( $rest: tt) +) => { $crate:: macros:: choice_enum!( @parse [ Default ] [ ] $( $rest) +) ; } ;
2732}
2833
2934pub ( super ) use choice_enum;
0 commit comments