Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions embedded-menu-macros/src/selectable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub fn expand_next_fn(input: &DataEnum) -> syn::Result<TokenStream> {
})
}

pub fn expand_name_fn(input: &DataEnum) -> syn::Result<TokenStream> {
pub fn expand_name_fn(input: &DataEnum, top_level_name: &Option<String>) -> syn::Result<TokenStream> {
let variants = input
.variants
.iter()
Expand All @@ -45,7 +45,7 @@ pub fn expand_name_fn(input: &DataEnum) -> syn::Result<TokenStream> {
}

let path = &v.ident;
let name_str = manual_name.unwrap_or_else(|| v.ident.to_string());
let name_str = manual_name.or(top_level_name.clone()).unwrap_or_else(|| v.ident.to_string());

Ok(quote! {
Self::#path => #name_str
Expand All @@ -64,11 +64,20 @@ pub fn expand_select_value(input: DeriveInput) -> syn::Result<TokenStream> {
let Data::Enum(data) = &input.data else {
unimplemented!("SelectValue can only be derived on enums");
};
let top_level_manual_name = match input
.attrs
.iter()
.find(|attr| attr.meta.path().is_ident("display_as"))
.map(syn::Attribute::parse_args::<LitStr>) {
None => None,
Some(Ok(top_level_name)) => Some(top_level_name.value()),
Some(Err(err)) => return Err(err),
};

let enum_name = input.ident;

let next_body = expand_next_fn(data)?;
let name_body = expand_name_fn(data)?;
let name_body = expand_name_fn(data, &top_level_manual_name)?;

Ok(quote! {
impl embedded_menu::items::menu_item::SelectValue for #enum_name {
Expand Down