Skip to content

Instantly share code, notes, and snippets.

@dushujun
Forked from anonymous/playground.rs
Last active September 4, 2017 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dushujun/da023b28208448400a288eef107ad2d1 to your computer and use it in GitHub Desktop.
Save dushujun/da023b28208448400a288eef107ad2d1 to your computer and use it in GitHub Desktop.
rust macro
macro_rules! enum_with_str_representation {
(enum $enum_name:ident {
$($variant:ident => $nice_name:expr,)+
}) => {
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
enum $enum_name {
$($variant),+
}
impl ::std::fmt::Display for $enum_name {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
match *self {
$($enum_name::$variant => write!(f, $nice_name)),+
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
struct ParseError;
impl ::std::str::FromStr for $enum_name {
type Err = ParseError;
fn from_str(s: &str) -> Result<$enum_name, Self::Err> {
match s {
$($nice_name => Ok($enum_name::$variant),)+
_ => Err(ParseError),
}
}
}
}
}
enum_with_str_representation! {
enum Status {
Success => "Success",
NoContent => "No content",
NotFound => "Not found",
}
}
fn main() {
println!("{:?}", Status::Success);
println!("{:?}", "Not found".parse::<Status>());
println!("{:?}", "Internal Server Error".parse::<Status>());
println!("{:?}", "Internal Server Error".parse::<Status>());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment