如何用Rust过程宏为WMI结构体批量添加指定属性?
如何用过程宏自动添加WMI结构体所需的Serde属性
可以实现这个需求,你需要借助syn和quote这两个过程宏工具库,它们能帮你解析和生成Rust语法树。
步骤1:添加依赖
在你的Cargo.toml中添加以下依赖(如果是独立的过程宏 crate,记得开启proc-macro = true):
[lib] proc-macro = true [dependencies] syn = { version = "2.0", features = ["full"] } quote = "1.0" proc-macro2 = "1.0" serde = { version = "1.0", features = ["derive"] }
步骤2:实现过程宏
下面是完整的过程宏代码,它会解析传入的WMI类名,自动生成所需的所有属性:
use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, LitStr}; #[proc_macro_attribute] pub fn wmi_struct(attr: TokenStream, item: TokenStream) -> TokenStream { // 解析属性中的WMI类名字符串(比如"Win32_OperatingSystem") let class_name = parse_macro_input!(attr as LitStr).value(); // 解析原结构体的语法树节点 let item = parse_macro_input!(item as syn::ItemStruct); // 拼接生成带所有目标属性的结构体代码 let expanded = quote! { #[derive(serde::Deserialize, Clone, Debug)] #[serde(rename = #class_name)] #[serde(rename_all = "PascalCase")] #item }; // 转换为TokenStream返回给编译器 expanded.into() }
步骤3:使用宏
现在你可以用简洁的语法定义WMI结构体了:
// 导入你的过程宏 use your_crate_name::wmi_struct; #[wmi_struct("Win32_OperatingSystem")] struct OperatingSystem { // 字段会自动按PascalCase映射WMI属性 name: String, version: String, } #[wmi_struct("Win32_PhysicalMemory")] struct PhysicalMemory { capacity: u64, speed: u32, }
关键说明
syn::parse_macro_input!负责将原始的TokenStream解析成可操作的Rust语法树节点,这里分别处理了属性参数和原结构体。quote!宏用来生成新的Rust代码,支持插值语法(#class_name会替换为传入的WMI类名字符串)。- 生成的代码完全符合你的需求,自动注入了所有重复的derive和serde属性。
内容的提问来源于stack exchange,提问作者SealsRock12
相关产品推荐
相关产品推荐

