From 509f315261b5e426d1849c0e0fac1bb5f3319971 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sun, 5 Nov 2023 14:44:29 -0600 Subject: [PATCH 1/2] add enum debug macro --- Cargo.lock | 10 ++++++++ Cargo.toml | 1 + stm32-data-macros/Cargo.toml | 12 ++++++++++ stm32-data-macros/src/lib.rs | 44 ++++++++++++++++++++++++++++++++++++ stm32-metapac-gen/Cargo.toml | 2 +- 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 stm32-data-macros/Cargo.toml create mode 100644 stm32-data-macros/src/lib.rs 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" } From 916fa6f7607ef8f678b8b8fcf5ae5c7fdafc4917 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sun, 5 Nov 2023 14:47:25 -0600 Subject: [PATCH 2/2] use new enum debug macro --- stm32-metapac-gen/src/data.rs | 5 +++-- stm32-metapac-gen/src/lib.rs | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/stm32-metapac-gen/src/data.rs b/stm32-metapac-gen/src/data.rs index 26d6983..c7363f1 100644 --- a/stm32-metapac-gen/src/data.rs +++ b/stm32-metapac-gen/src/data.rs @@ -1,4 +1,5 @@ use serde::Deserialize; +use stm32_data_macros::EnumDebug; pub mod ir { use super::*; @@ -176,7 +177,7 @@ pub mod ir { pub block: String, } - #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] + #[derive(EnumDebug, Eq, PartialEq, Clone, Deserialize)] pub enum Access { ReadWrite, Read, @@ -263,7 +264,7 @@ pub struct FlashSettings { pub erase_value: u8, } -#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] +#[derive(EnumDebug, Eq, PartialEq, Clone, Deserialize)] pub enum MemoryRegionKind { #[serde(rename = "flash")] Flash, diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs index 9fffb98..325993e 100644 --- a/stm32-metapac-gen/src/lib.rs +++ b/stm32-metapac-gen/src/lib.rs @@ -394,15 +394,10 @@ fn stringify(metadata: T) -> String { metadata .replace(": [", ": &[") - .replace("kind: Ram", "kind: MemoryRegionKind::Ram") - .replace("kind: Flash", "kind: MemoryRegionKind::Flash") .replace("Register(", "BlockItemInner::Register(") .replace("Block(", "BlockItemInner::Block(") .replace("Regular(", "Array::Regular(") .replace("Cursed(", "Array::Cursed(") - .replace("Read,", "Access::Read,") - .replace("Write,", "Access::Write,") - .replace("ReadAccess::Write,", "Access::ReadWrite,") } fn gen_opts() -> generate::Options {