You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:57:34