rust 将宏导出到特定类型

6xfqseft  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(87)

我正在尝试创建一个派生宏,它在与Struct一起使用时会编译,而在与任何其他类型一起使用时会崩溃。
但是-我不确定如何匹配派生块中的类型。
怎么做才合适呢?这算不算惯用法?或者有更简单的方法来做这件事吗?

use proc_macro::TokenStream;
use quote::quote;
use syn;

#[proc_macro_derive(MyCustomMacro)]
pub fn my_custom_macro_derive(input: TokenStream) -> TokenStream {

    // parse TokenStream into syntax tree
    let ast = syn::parse(input).unwrap();

    // implement macro
    match ast.Type.to_string() {
        "Struct" => {
            impl_my_custom_macro(&ast)
        },
        _ => {
            panic!("Can only be used with Structs.");
        }
    }
}

fn impl_my_custom_macro(ast: &syn::DeriveInput) -> TokenStream {
    // snip...
}
wqsoz72f

wqsoz72f1#

使用DeriveInput.data:

use proc_macro::TokenStream;
use quote::quote;
use syn::DeriveInput;

#[proc_macro_derive(MyCustomMacro)]
pub fn my_custom_macro_derive(input: TokenStream) -> TokenStream {

    // parse TokenStream into syntax tree
    let ast: DeriveInput = syn::parse(input).unwrap();

    // implement macro
    match ast.data {
        syn::Data::Struct(..) => {
            impl_my_custom_macro(&ast)
        },
        _ => {
            panic!("Can only be used with Structs.")
        }
    }
}

fn impl_my_custom_macro(ast: &syn::DeriveInput) -> TokenStream {
    todo!()
}

相关问题