use std::{convert::TryFrom, fmt};
#[derive(Clone, Debug)]
pub enum Attr {
DisplayFromValue,
Display,
DisplayVariant,
DisplayVariantSnake,
Iterator,
NoDerive,
Derive(String),
Getter(String),
EnumName(String),
NotPublic,
Public,
}
impl TryFrom<&str> for Attr {
type Error = String;
fn try_from(value: &str) -> Result<Self, Self::Error> {
if Attr::Derive(String::new()).to_string() == value {
Ok(Attr::Derive(String::new()))
} else if Attr::Getter(String::new()).to_string() == value {
Ok(Attr::Getter(String::new()))
} else if Attr::EnumName(String::new()).to_string() == value {
Ok(Attr::EnumName(String::new()))
} else if Attr::NoDerive.to_string() == value {
Ok(Attr::NoDerive)
} else if Attr::Display.to_string() == value {
Ok(Attr::Display)
} else if Attr::DisplayVariant.to_string() == value {
Ok(Attr::DisplayVariant)
} else if Attr::DisplayVariantSnake.to_string() == value {
Ok(Attr::DisplayVariantSnake)
} else if Attr::Iterator.to_string() == value {
Ok(Attr::Iterator)
} else if Attr::DisplayFromValue.to_string() == value {
Ok(Attr::DisplayFromValue)
} else if Attr::NotPublic.to_string() == value {
Ok(Attr::NotPublic)
} else if Attr::Public.to_string() == value {
Ok(Attr::Public)
} else {
Err(format!("Unknown attribute \"{value}\""))
}
}
}
impl fmt::Display for Attr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{}",
match self {
Self::Derive(..) => "derive",
Self::Getter(..) => "getter",
Self::EnumName(..) => "name",
Self::Display => "display",
Self::DisplayVariant => "display_variant",
Self::DisplayVariantSnake => "display_variant_snake",
Self::Iterator => "iterator",
Self::DisplayFromValue => "display_from_value",
Self::NoDerive => "no_derive",
Self::NotPublic => "not_public",
Self::Public => "public",
}
)
}
}