1#[macro_export]
6macro_rules! enum_str {
7 ($name:ident { $($variant:ident($str:expr), )* }) => {
8 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
9 pub enum $name {
10 $($variant,)*
11 }
12
13 impl ::serde::Serialize for $name {
14 fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
15 where S: ::serde::Serializer,
16 {
17 serializer.serialize_str(match *self {
18 $( $name::$variant => $str, )*
19 })
20 }
21 }
22
23 impl<'de> ::serde::Deserialize<'de> for $name {
24 fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
25 where D: ::serde::Deserializer<'de>,
26 {
27 struct EnumVisitor;
28
29 impl<'de> ::serde::de::Visitor<'de> for EnumVisitor {
30 type Value = $name;
31
32 fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
33 formatter.write_str(concat!("a string matching one of the ", stringify!($name), " variants"))
34 }
35
36 fn visit_str<E>(self, value: &str) -> ::std::result::Result<$name, E>
37 where E: ::serde::de::Error,
38 {
39 match value {
40 $( $str => Ok($name::$variant), )*
41 _ => Err(E::custom(format!("unknown {} variant: {}", stringify!($name), value))),
42 }
43 }
44 }
45
46 deserializer.deserialize_str(EnumVisitor)
47 }
48 }
49 }
50}