add enum debug macro

This commit is contained in:
xoviat 2023-11-05 14:44:29 -06:00
parent 73b8c37ae7
commit 509f315261
5 changed files with 68 additions and 1 deletions

10
Cargo.lock generated
View File

@ -614,6 +614,15 @@ dependencies = [
"stm32-data-serde", "stm32-data-serde",
] ]
[[package]]
name = "stm32-data-macros"
version = "0.1.0"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "stm32-data-serde" name = "stm32-data-serde"
version = "0.1.0" version = "0.1.0"
@ -635,6 +644,7 @@ dependencies = [
"regex", "regex",
"serde", "serde",
"serde_json", "serde_json",
"stm32-data-macros",
] ]
[[package]] [[package]]

View File

@ -3,6 +3,7 @@ members = [
"stm32-data-gen", "stm32-data-gen",
"stm32-data-serde", "stm32-data-serde",
"stm32-metapac-gen", "stm32-metapac-gen",
"stm32-data-macros",
] ]
exclude = [ exclude = [
"build" "build"

View 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"

View 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()
}

View File

@ -11,4 +11,4 @@ chiptool = { git = "https://github.com/embassy-rs/chiptool", rev = "0621765f915c
serde = { version = "1.0.157", features = [ "derive" ] } serde = { version = "1.0.157", features = [ "derive" ] }
serde_json = "1.0.94" serde_json = "1.0.94"
proc-macro2 = "1.0.52" proc-macro2 = "1.0.52"
stm32-data-macros = { version = "0.1.0", path = "../stm32-data-macros" }