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",
]
[[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]]

View File

@ -3,6 +3,7 @@ members = [
"stm32-data-gen",
"stm32-data-serde",
"stm32-metapac-gen",
"stm32-data-macros",
]
exclude = [
"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_json = "1.0.94"
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 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,

View File

@ -394,15 +394,10 @@ fn stringify<T: Debug>(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 {