Ein*_*che 4 rust rust-proc-macros rust-attributes
我正在编写一个库,其中包含具有自定义属性的自定义派生宏。为此,我使用darling
. 因此,我的项目结构如下:
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pg-worm\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pg-worm-derive\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/lib.rs\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n我的 proc 宏是这样指定的 ( pg-worm/pg-worm-derive/src/lib.rs
):
use darling::FromDeriveInput;\nuse proc_macro::{self, TokenStream};\nuse syn::parse_macro_input;\n\n#[derive(FromDeriveInput)]\n#[darling(attributes(table))]\nModelInput {\n table_name: Option<String>\n}\n\n#[proc_macro_derive(Model)]\npub fn derive(input: TokenStream) -> TokenStream {\n let opts = ModelInput::from_derive_input(&parse_macro_input!(input)).unwrap();\n\n // macro magic happens\n}\n
Run Code Online (Sandbox Code Playgroud)\n然后我从主文件 ( pg-worm/src/lib.rs
) 中重新导出宏:
pub use pg_worm_derive::*;\n\npub trait Model {\n // trait specs\n}\n
Run Code Online (Sandbox Code Playgroud)\n但是当我使用以下代码测试我的宏时(也在pg-worm/src/lib.rs
):
#[cfg(test)]\nmod tests {\n use pg_worm::Model;\n\n #[derive(Model)]\n #[table(table_name = "person")]\n struct Person {\n id: i64,\n name: String,\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n我收到以下错误cargo test
:
error: cannot find attribute `table` in this scope\n --> src/lib.rs:96:7\n |\n96 | #[table(table_name = "person")]\n | ^^^^^ help: a built-in attribute with a similar name exists: `stable`\n\nerror: could not compile `pg-worm` due to previous error\n
Run Code Online (Sandbox Code Playgroud)\n当我跳过使用该table
属性时它起作用,因此宏本身似乎确实起作用。为什么该属性不起作用?我需要做一些额外的再导出吗?
您需要指定它#[table]
是以下的辅助属性#[derive(Model)]
:
#[proc_macro_derive(Model, attributes(table))]
pub fn derive(input: TokenStream) -> TokenStream { ... }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1220 次 |
最近记录: |