Skip to content

Commit

Permalink
gazebo: Add variant_name_lowercase
Browse files Browse the repository at this point in the history
Summary:
As it says in the title, need it next diff.

You can't really implement this on top of gazebo, at least not if you're hoping to get out a `&'static str`

Reviewed By: stepancheg

Differential Revision: D57251553

fbshipit-source-id: 63b2e4786aed7c06846b438fe7c3f1ec2a9d7d49
  • Loading branch information
JakobDegen authored and facebook-github-bot committed May 16, 2024
1 parent 0625cae commit 94b18b3
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
25 changes: 22 additions & 3 deletions gazebo/gazebo/src/variants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ pub use gazebo_derive::VariantName;

pub trait VariantName {
fn variant_name(&self) -> &'static str;

fn variant_name_lowercase(&self) -> &'static str;
}

impl<T> VariantName for Option<T> {
Expand All @@ -101,6 +103,13 @@ impl<T> VariantName for Option<T> {
None => "None",
}
}

fn variant_name_lowercase(&self) -> &'static str {
match self {
Self::Some(_) => "some",
None => "none",
}
}
}

impl<T, E> VariantName for Result<T, E> {
Expand All @@ -110,6 +119,13 @@ impl<T, E> VariantName for Result<T, E> {
Self::Err(_) => "Err",
}
}

fn variant_name_lowercase(&self) -> &'static str {
match self {
Self::Ok(_) => "ok",
Self::Err(_) => "err",
}
}
}

#[cfg(test)]
Expand All @@ -125,16 +141,19 @@ mod tests {
enum MyEnum {
Foo,
Bar(usize),
Baz { field: usize },
FooBaz { field: usize },
}

let x = MyEnum::Foo;
assert_eq!(x.variant_name(), "Foo");
assert_eq!(x.variant_name_lowercase(), "foo");

let x = MyEnum::Bar(1);
assert_eq!(x.variant_name(), "Bar");
assert_eq!(x.variant_name_lowercase(), "bar");

let x = MyEnum::Baz { field: 1 };
assert_eq!(x.variant_name(), "Baz");
let x = MyEnum::FooBaz { field: 1 };
assert_eq!(x.variant_name(), "FooBaz");
assert_eq!(x.variant_name_lowercase(), "foo_baz");
}
}
11 changes: 11 additions & 0 deletions gazebo/gazebo_derive/src/variant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use syn::Ident;
pub(crate) fn derive_variant_names(input: DeriveInput) -> syn::Result<proc_macro::TokenStream> {
if let Data::Enum(data_enum) = input.data {
let mut variant_body = Vec::new();
let mut variant_lowercase_body = Vec::new();
for variant in data_enum.variants {
let variant_name = &variant.ident;
let patterns = match variant.fields {
Expand All @@ -26,9 +27,13 @@ pub(crate) fn derive_variant_names(input: DeriveInput) -> syn::Result<proc_macro
Fields::Unnamed(_) => quote! { (..) },
};
let variant_name_str = variant_name.to_string();
let variant_name_lowercase_str = to_snake_case(&variant_name_str);
variant_body.push(quote! {
Self::#variant_name #patterns => #variant_name_str
});
variant_lowercase_body.push(quote! {
Self::#variant_name #patterns => #variant_name_lowercase_str
});
}

let name = &input.ident;
Expand All @@ -41,6 +46,12 @@ pub(crate) fn derive_variant_names(input: DeriveInput) -> syn::Result<proc_macro
#(#variant_body,)*
}
}

fn variant_name_lowercase(&self) -> &'static str {
match self {
#(#variant_lowercase_body,)*
}
}
}
};

Expand Down

0 comments on commit 94b18b3

Please sign in to comment.