add enum debug macro
This commit is contained in:
parent
73b8c37ae7
commit
509f315261
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -614,6 +614,15 @@ dependencies = [
|
||||
"stm32-data-serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stm32-data-macros"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stm32-data-serde"
|
||||
version = "0.1.0"
|
||||
@ -635,6 +644,7 @@ dependencies = [
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"stm32-data-macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -3,6 +3,7 @@ members = [
|
||||
"stm32-data-gen",
|
||||
"stm32-data-serde",
|
||||
"stm32-metapac-gen",
|
||||
"stm32-data-macros",
|
||||
]
|
||||
exclude = [
|
||||
"build"
|
||||
|
12
stm32-data-macros/Cargo.toml
Normal file
12
stm32-data-macros/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
||||
[package]
|
||||
name = "stm32-data-macros"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
proc-macro2 = "1.0.36"
|
||||
quote = "1.0.15"
|
||||
syn = "1.0"
|
44
stm32-data-macros/src/lib.rs
Normal file
44
stm32-data-macros/src/lib.rs
Normal file
@ -0,0 +1,44 @@
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::quote;
|
||||
use syn;
|
||||
use syn::Data;
|
||||
|
||||
#[proc_macro_derive(EnumDebug)]
|
||||
pub fn enum_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
let ast = syn::parse(input).unwrap();
|
||||
|
||||
impl_enum_derive(&ast).into()
|
||||
}
|
||||
|
||||
fn impl_enum_derive(ast: &syn::DeriveInput) -> TokenStream {
|
||||
let name = &ast.ident;
|
||||
let enumm = match &ast.data {
|
||||
Data::Enum(e) => e,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let match_variants: TokenStream = enumm
|
||||
.variants
|
||||
.iter()
|
||||
.map(|v| {
|
||||
let variant_name = &v.ident;
|
||||
let variant_debug = format!("{}::{}", name, variant_name);
|
||||
|
||||
quote! {
|
||||
#name::#variant_name => #variant_debug,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
quote! {
|
||||
#[automatically_derived]
|
||||
impl ::core::fmt::Debug for #name {
|
||||
fn fmt(self: &Self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
||||
::core::fmt::Formatter::write_str(f, match self {
|
||||
#match_variants
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
.into()
|
||||
}
|
@ -11,4 +11,4 @@ chiptool = { git = "https://github.com/embassy-rs/chiptool", rev = "0621765f915c
|
||||
serde = { version = "1.0.157", features = [ "derive" ] }
|
||||
serde_json = "1.0.94"
|
||||
proc-macro2 = "1.0.52"
|
||||
|
||||
stm32-data-macros = { version = "0.1.0", path = "../stm32-data-macros" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user