macro_rules! define_model_enum {
(
$(#[$enum_meta:meta])*
$vis:vis enum $name:ident {
$(
$(#[$variant_meta:meta])*
$variant:ident => $model_id:literal,
)+
}
) => {
$(#[$enum_meta])*
#[derive(Debug, Clone, PartialEq, Eq)]
$vis enum $name {
$(
$(#[$variant_meta])*
$variant,
)+
Custom(String),
}
impl $name {
pub fn as_str(&self) -> &str {
match self {
$( $name::$variant => $model_id, )+
$name::Custom(name) => name,
}
}
pub fn from_string(name: impl Into<String>) -> Self {
let name = name.into();
match name.as_str() {
$( $model_id => $name::$variant, )+
_ => $name::Custom(name),
}
}
}
impl ::std::str::FromStr for $name {
type Err = ::std::convert::Infallible;
fn from_str(s: &str) -> ::std::result::Result<Self, Self::Err> {
Ok($name::from_string(s))
}
}
impl ::std::convert::From<&str> for $name {
fn from(s: &str) -> Self {
$name::from_string(s)
}
}
impl ::std::convert::From<String> for $name {
fn from(s: String) -> Self {
$name::from_string(s)
}
}
};
}
pub(crate) use define_model_enum;