0

我需要能够提取类型 DieselHandler,理想情况下,以允许可重复的 data_loader 属性来针对多种类型进行转换的方式。

#[derive(Loadable)]
#[data_loader(handler = DieselHandler<FooLoader>)]

如果我使用handler: syn::Type有错误:

特征界限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)
}
4

1 回答 1

0

darling编写时需要引号,#[attr(foo = "bar")]因为syn不认为无引号的形式是有效的Meta,并且Metadarling整个API的基础。

这与 一致serde,我仍然认为它是最接近 Rust 中 proc-macro API 标准的东西。

如果您想编写类似. 从技术上讲,类型参数是路径的一部分,因此应该在纸上工作。darling::util::PathList#[data_loader(DieselHandler)]DieselHandler<FooLoader>

于 2021-08-03T14:06:13.103 回答