diff --git a/Cargo.lock b/Cargo.lock index 32449e3..d972fbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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]] diff --git a/Cargo.toml b/Cargo.toml index ea3a4e5..3a3d81d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "stm32-data-gen", "stm32-data-serde", "stm32-metapac-gen", + "stm32-data-macros", ] exclude = [ "build" diff --git a/stm32-data-macros/Cargo.toml b/stm32-data-macros/Cargo.toml new file mode 100644 index 0000000..bd472ea --- /dev/null +++ b/stm32-data-macros/Cargo.toml @@ -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" \ No newline at end of file diff --git a/stm32-data-macros/src/lib.rs b/stm32-data-macros/src/lib.rs new file mode 100644 index 0000000..8a4f0be --- /dev/null +++ b/stm32-data-macros/src/lib.rs @@ -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() +} diff --git a/stm32-metapac-gen/Cargo.toml b/stm32-metapac-gen/Cargo.toml index fb598a7..16e6c43 100644 --- a/stm32-metapac-gen/Cargo.toml +++ b/stm32-metapac-gen/Cargo.toml @@ -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" }