使用Darling编写自定义proc_macro时出现“找不到table属性”错误
问题原因与解决步骤
核心原因
你只重导出了Model派生宏,但#[table]作为自定义属性,本身需要是一个**属性宏(proc-macro-attribute)**才能被Rust编译器识别。哪怕你在派生宏里用#[darling(attributes(table))]声明了要解析这个属性,编译器依然会因为找不到对应的属性宏定义而报错。
解决步骤
1. 在子crate(pg-worm-derive)中定义table属性宏
在pg-worm-derive/src/lib.rs里添加属性宏声明——我们只需要让编译器识别这个属性,不需要额外逻辑,直接返回原代码即可:
use proc_macro::TokenStream; // 定义table属性宏,仅作为占位让编译器识别 #[proc_macro_attribute] pub fn table(_attr: TokenStream, item: TokenStream) -> TokenStream { item } // 你的Model派生宏原代码 #[proc_macro_derive(Model, attributes(table))] pub fn derive_model(input: TokenStream) -> TokenStream { // 原有的darling解析逻辑... }
同时确保子crate的Cargo.toml开启proc-macro特性:
[lib] proc-macro = true
2. 在主crate(pg-worm)中重导出属性宏
修改pg-worm/src/lib.rs,把属性宏和派生宏一起重导出:
// 同时重导出派生宏Model和属性宏table pub use pg_worm_derive::{Model, table};
3. 在测试代码中导入使用
在测试或业务代码里同时导入两个宏:
use pg_worm::{Model, table}; #[table(table_name = "person")] #[derive(Model)] struct Person { id: i32, name: String, }
这样编译器就能识别#[table]属性,派生宏也能正常解析其中的参数了。
内容的提问来源于stack exchange,提问作者hjpev
相关产品推荐
相关产品推荐

