Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_derive/src/enum_variant_meta.rs
6598 views
1
use proc_macro::{Span, TokenStream};
2
use quote::quote;
3
use syn::{parse_macro_input, Data, DeriveInput};
4
5
pub fn derive_enum_variant_meta(input: TokenStream) -> TokenStream {
6
let ast = parse_macro_input!(input as DeriveInput);
7
let variants = match &ast.data {
8
Data::Enum(v) => &v.variants,
9
_ => {
10
return syn::Error::new(Span::call_site().into(), "Only enums are supported")
11
.into_compile_error()
12
.into()
13
}
14
};
15
16
let generics = ast.generics;
17
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
18
19
let struct_name = &ast.ident;
20
let idents = variants.iter().map(|v| &v.ident);
21
let names = variants.iter().map(|v| v.ident.to_string());
22
let indices = 0..names.len();
23
24
TokenStream::from(quote! {
25
impl #impl_generics #struct_name #ty_generics #where_clause {
26
pub fn enum_variant_index(&self) -> usize {
27
match self {
28
#(#struct_name::#idents {..} => #indices,)*
29
}
30
}
31
pub fn enum_variant_name(&self) -> &'static str {
32
static variants: &[&str] = &[
33
#(#names,)*
34
];
35
let index = self.enum_variant_index();
36
variants[index]
37
}
38
}
39
})
40
}
41
42