@@ -17,17 +17,21 @@ use isatty::stdout_isatty;
17
17
use std:: collections:: HashSet ;
18
18
use std:: path:: { Path , PathBuf } ;
19
19
20
- /// Macro for deriving implementations of Serialize/Deserialize for enums
20
+ /// Macro that will stringify the enum variants or a provided textual repr
21
21
#[ macro_export]
22
- macro_rules! impl_enum_serialize_and_deserialize {
23
- ( @stringify $variant: ident) => (
22
+ macro_rules! configuration_option_enum_stringify {
23
+ ( $variant: ident) => {
24
24
stringify!( $variant)
25
- ) ;
25
+ } ;
26
26
27
- ( @stringify $_variant: ident: $value: expr) => (
27
+ ( $_variant: ident: $value: expr) => {
28
28
stringify!( $value)
29
- ) ;
29
+ } ;
30
+ }
30
31
32
+ /// Macro for deriving implementations of Serialize/Deserialize for enums
33
+ #[ macro_export]
34
+ macro_rules! impl_enum_serialize_and_deserialize {
31
35
( $e: ident, $( $variant: ident $( : $value: expr) * ) ,* ) => {
32
36
impl :: serde:: ser:: Serialize for $e {
33
37
fn serialize<S >( & self , serializer: S ) -> Result <S :: Ok , S :: Error >
@@ -40,7 +44,7 @@ macro_rules! impl_enum_serialize_and_deserialize {
40
44
match * self {
41
45
$(
42
46
$e:: $variant => serializer. serialize_str(
43
- impl_enum_serialize_and_deserialize! ( @stringify $variant $( : $value) * )
47
+ configuration_option_enum_stringify! ( $variant $( : $value) * )
44
48
) ,
45
49
) *
46
50
_ => {
@@ -69,13 +73,13 @@ macro_rules! impl_enum_serialize_and_deserialize {
69
73
}
70
74
let s = d. deserialize_string( StringOnly :: <D >( PhantomData ) ) ?;
71
75
$(
72
- if impl_enum_serialize_and_deserialize! ( @stringify $variant $( : $value) * )
76
+ if configuration_option_enum_stringify! ( $variant $( : $value) * )
73
77
. eq_ignore_ascii_case( & s) {
74
78
return Ok ( $e:: $variant) ;
75
79
}
76
80
) *
77
81
static ALLOWED : & ' static [ & str ] = & [
78
- $( impl_enum_serialize_and_deserialize! ( @stringify $variant $( : $value) * ) , ) * ] ;
82
+ $( configuration_option_enum_stringify! ( $variant $( : $value) * ) , ) * ] ;
79
83
Err ( D :: Error :: unknown_variant( & s, ALLOWED ) )
80
84
}
81
85
}
@@ -85,7 +89,7 @@ macro_rules! impl_enum_serialize_and_deserialize {
85
89
86
90
fn from_str( s: & str ) -> Result <Self , Self :: Err > {
87
91
$(
88
- if impl_enum_serialize_and_deserialize! ( @stringify $variant $( : $value) * )
92
+ if configuration_option_enum_stringify! ( $variant $( : $value) * )
89
93
. eq_ignore_ascii_case( s) {
90
94
return Ok ( $e:: $variant) ;
91
95
}
@@ -99,7 +103,7 @@ macro_rules! impl_enum_serialize_and_deserialize {
99
103
let mut variants = Vec :: new( ) ;
100
104
$(
101
105
variants. push(
102
- impl_enum_serialize_and_deserialize! ( @stringify $variant $( : $value) * )
106
+ configuration_option_enum_stringify! ( $variant $( : $value) * )
103
107
) ;
104
108
) *
105
109
format!( "[{}]" , variants. join( "|" ) )
@@ -110,11 +114,21 @@ macro_rules! impl_enum_serialize_and_deserialize {
110
114
111
115
macro_rules! configuration_option_enum {
112
116
( $e: ident: $( $name: ident $( : $value: expr) * ) ,+ $( , ) * ) => (
113
- #[ derive( Copy , Clone , Eq , PartialEq , Debug ) ]
117
+ #[ derive( Copy , Clone , Eq , PartialEq ) ]
114
118
pub enum $e {
115
119
$( $name ) ,+
116
120
}
117
121
122
+ impl :: std:: fmt:: Debug for $e {
123
+ fn fmt( & self , f: & mut :: std:: fmt:: Formatter ) -> :: std:: fmt:: Result {
124
+ f. write_str( match self {
125
+ $(
126
+ $e:: $name => configuration_option_enum_stringify!( $name $( : $value) * ) ,
127
+ ) +
128
+ } )
129
+ }
130
+ }
131
+
118
132
impl_enum_serialize_and_deserialize!( $e, $( $name $( : $value) * ) ,+) ;
119
133
) ;
120
134
}
0 commit comments