Skip to content

Instantly share code, notes, and snippets.

@jacobmischka
Created April 10, 2017 04:01
Show Gist options
  • Save jacobmischka/5b1ffcc8af47c94ad543c412eaf25c36 to your computer and use it in GitHub Desktop.
Save jacobmischka/5b1ffcc8af47c94ad543c412eaf25c36 to your computer and use it in GitHub Desktop.
macro_rules! code_value {
(
$NAME:ident {
$(
$( $IN:pat )|+ => $VARIANT:ident => $OUT:expr
),*
}
) => (
#[derive(Clone, Copy, Debug)]
pub enum $NAME {
$($VARIANT,)*
}
impl CodeValue for $NAME {
fn value(&self) -> &str {
match *self {
$(
$NAME::$VARIANT => $OUT,
)*
}
}
fn from(value: &str) -> Option<$NAME> {
match value {
$(
$(
$IN
)|+ => Some($NAME::$VARIANT),
)*
}
}
}
);
(
$NAME:ident {
$(
$( $IN:pat )|+ => $VARIANT:ident => $OUT:expr
),*
}: $DEFAULT:ident
) => (
#[derive(Clone, Copy, Debug)]
pub enum $NAME {
$($VARIANT,)*
}
impl CodeValue for $NAME {
fn value(&self) -> &str {
match *self {
$(
$NAME::$VARIANT => $OUT,
)*
}
}
fn from(value: &str) -> Option<$NAME> {
match value {
$(
$(
$IN
)|+ => Some($NAME::$VARIANT),
)*
}
}
}
impl Default for $NAME {
fn default() -> $NAME { $NAME::$DEFAULT }
}
);
(
$NAME:ident {
$(
$VARIANT:ident <=> $VAL:expr
),*
}
) => (
#[derive(Clone, Copy, Debug)]
pub enum $NAME {
$($VARIANT,)*
}
impl CodeValue for $NAME {
fn value(&self) -> &str {
match *self {
$(
$NAME::$VARIANT => $VAL,
)*
}
}
fn from(value: &str) -> Option<$NAME> {
match value {
$(
$VAL => Some($NAME::$VARIANT)
),*,
_ => None
}
}
}
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment