问题描述
我需要能够提取 DieselHandler 类型,理想情况下,允许使用可重复的 data_loader 属性以针对多种类型进行转换。
#[derive(Loadable)]
#[data_loader(handler = DieselHandler<FooLoader>)]
如果我使用 handler: syn::Type
会出现错误:
trait bound syn::Type: FromMeta
不满足
特征 FromMeta
没有为 syn::Type
如何在此处传入类型,甚至检查包装器结构?
#[derive(Debug,FromDeriveInput)]
#[darling(attributes(data_loader))]
struct LoadByArgs {
#[darling(default)]
internal: bool,handler: ????,}
#[proc_macro_derive(Loadable,attributes(data_loader))]
pub fn load_by(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let LoadByArgs {
internal,handler
} = FromDeriveInput::from_derive_input(&input).expect("can't parse attribute");
let expanded = quote! {
...
};
proc_macro::TokenStream::from(expanded)
}
解决方法
darling
在写 #[attr(foo = "bar")]
时需要引号,因为 syn
不认为无引号形式是有效的 Meta
,而 {{1} } 是 Meta
整个 API 的基础。
这与 darling
一致,我仍然认为它最接近 Rust 中的 proc-macro API 标准。
如果您想编写类似 serde
的内容,可以使用 darling::util::PathList
。从技术上讲,类型参数是路径的一部分,因此#[data_loader(DieselHandler)]
应该在纸上工作。