use std::collections::HashSet;
use std::path::{Path, PathBuf};
-/// Macro for deriving implementations of Serialize/Deserialize for enums
+/// Macro that will stringify the enum variants or a provided textual repr
#[macro_export]
-macro_rules! impl_enum_serialize_and_deserialize {
- (@stringify $variant:ident) => (
+macro_rules! configuration_option_enum_stringify {
+ ($variant:ident) => {
stringify!($variant)
- );
+ };
- (@stringify $_variant:ident: $value:expr) => (
+ ($_variant:ident: $value:expr) => {
stringify!($value)
- );
+ };
+}
+/// Macro for deriving implementations of Serialize/Deserialize for enums
+#[macro_export]
+macro_rules! impl_enum_serialize_and_deserialize {
( $e:ident, $( $variant:ident $(: $value:expr)* ),* ) => {
impl ::serde::ser::Serialize for $e {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
match *self {
$(
$e::$variant => serializer.serialize_str(
- impl_enum_serialize_and_deserialize!(@stringify $variant $(: $value)*)
+ configuration_option_enum_stringify!($variant $(: $value)*)
),
)*
_ => {
}
let s = d.deserialize_string(StringOnly::<D>(PhantomData))?;
$(
- if impl_enum_serialize_and_deserialize!(@stringify $variant $(: $value)*)
+ if configuration_option_enum_stringify!($variant $(: $value)*)
.eq_ignore_ascii_case(&s) {
return Ok($e::$variant);
}
)*
static ALLOWED: &'static[&str] = &[
- $(impl_enum_serialize_and_deserialize!(@stringify $variant $(: $value)*),)*];
+ $(configuration_option_enum_stringify!($variant $(: $value)*),)*];
Err(D::Error::unknown_variant(&s, ALLOWED))
}
}
fn from_str(s: &str) -> Result<Self, Self::Err> {
$(
- if impl_enum_serialize_and_deserialize!(@stringify $variant $(: $value)*)
+ if configuration_option_enum_stringify!($variant $(: $value)*)
.eq_ignore_ascii_case(s) {
return Ok($e::$variant);
}
let mut variants = Vec::new();
$(
variants.push(
- impl_enum_serialize_and_deserialize!(@stringify $variant $(: $value)*)
+ configuration_option_enum_stringify!($variant $(: $value)*)
);
)*
format!("[{}]", variants.join("|"))
macro_rules! configuration_option_enum {
($e:ident: $( $name:ident $(: $value:expr)* ),+ $(,)*) => (
- #[derive(Copy, Clone, Eq, PartialEq, Debug)]
+ #[derive(Copy, Clone, Eq, PartialEq)]
pub enum $e {
$( $name ),+
}
+ impl ::std::fmt::Debug for $e {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+ f.write_str(match self {
+ $(
+ $e::$name => configuration_option_enum_stringify!($name $(: $value)*),
+ )+
+ })
+ }
+ }
+
impl_enum_serialize_and_deserialize!($e, $( $name $(: $value)* ),+);
);
}