如何使用亲爱的从程序宏属性中提取类型?

问题描述

我需要能够提取 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)] 应该在纸上工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...