Merge pull request #302 from xoviat/helper-macros

add "enum debug" helper macro
This commit is contained in:
xoviat 2023-11-05 21:40:24 +00:00 committed by GitHub
commit 133a32cbbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 71 additions and 8 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" }

View File

@ -1,4 +1,5 @@
use serde::Deserialize; use serde::Deserialize;
use stm32_data_macros::EnumDebug;
pub mod ir { pub mod ir {
use super::*; use super::*;
@ -176,7 +177,7 @@ pub mod ir {
pub block: String, pub block: String,
} }
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] #[derive(EnumDebug, Eq, PartialEq, Clone, Deserialize)]
pub enum Access { pub enum Access {
ReadWrite, ReadWrite,
Read, Read,
@ -263,7 +264,7 @@ pub struct FlashSettings {
pub erase_value: u8, pub erase_value: u8,
} }
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] #[derive(EnumDebug, Eq, PartialEq, Clone, Deserialize)]
pub enum MemoryRegionKind { pub enum MemoryRegionKind {
#[serde(rename = "flash")] #[serde(rename = "flash")]
Flash, Flash,

View File

@ -394,15 +394,10 @@ fn stringify<T: Debug>(metadata: T) -> String {
metadata metadata
.replace(": [", ": &[") .replace(": [", ": &[")
.replace("kind: Ram", "kind: MemoryRegionKind::Ram")
.replace("kind: Flash", "kind: MemoryRegionKind::Flash")
.replace("Register(", "BlockItemInner::Register(") .replace("Register(", "BlockItemInner::Register(")
.replace("Block(", "BlockItemInner::Block(") .replace("Block(", "BlockItemInner::Block(")
.replace("Regular(", "Array::Regular(") .replace("Regular(", "Array::Regular(")
.replace("Cursed(", "Array::Cursed(") .replace("Cursed(", "Array::Cursed(")
.replace("Read,", "Access::Read,")
.replace("Write,", "Access::Write,")
.replace("ReadAccess::Write,", "Access::ReadWrite,")
} }
fn gen_opts() -> generate::Options { fn gen_opts() -> generate::Options {