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

如何通过tonic_build仅为同包枚举添加编译时注解?

解决方案

要实现给指定包下的枚举额外添加strum::EnumString注解,同时保持所有类型都带有serde的derive,可以通过tonic_build的条件属性匹配来完成:

1. 配置build.rs

在项目的build.rs中,利用tonic_build::configure()的type_attribute方法,结合闭包精准匹配目标枚举:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    tonic_build::configure()
        // 为所有类型添加serde序列化/反序列化derive
        .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
        // 仅为foo.bar包下的枚举添加strum::EnumString
        .type_attribute(
            |metadata| {
                metadata.package == "foo.bar" && metadata.kind == prost_build::TypeKind::Enum
            },
            "#[derive(strum::EnumString)]",
        )
        .compile(&["proto/your_proto_file.proto"], &["proto"])?;
    Ok(())
}

2. 依赖配置

确保Cargo.toml中包含所需依赖:

[dependencies]
tonic = "0.10"
prost = "0.12"
serde = { version = "1.0", features = ["derive"] }
strum = "0.25"
strum_macros = "0.25"

[build-dependencies]
tonic-build = "0.10"

效果说明

生成的Rust代码会完全符合预期:

  • 结构体A仅带有serde相关derive:#[derive(serde::Serialize, serde::Deserialize)]
  • 枚举Enu同时包含serde和strum的derive:#[derive(serde::Serialize, serde::Deserialize, strum::EnumString)]

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:56