macro_rules! string_enum {
(
$(#[$meta:meta])*
$name:ident {
$( $(#[$variant_meta:meta])* $variant:ident = $wire:literal ),* $(,)?
}
) => {
$(#[$meta])*
#[derive(
Debug, Clone, PartialEq, Eq, Hash,
strum::Display, strum::EnumString,
serde::Serialize, serde::Deserialize,
)]
#[serde(into = "String", from = "String")]
#[non_exhaustive]
pub enum $name {
$(
$(#[$variant_meta])*
#[strum(serialize = $wire)]
$variant,
)*
#[strum(default)]
Unknown(String),
}
impl From<$name> for String {
fn from(v: $name) -> Self { v.to_string() }
}
impl From<String> for $name {
fn from(v: String) -> Self {
match v.as_str() {
$($wire => $name::$variant,)*
_ => $name::Unknown(v),
}
}
}
};
}
pub(crate) use string_enum;