55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
//! #[clause_param]属性宏实现
|
|
|
|
use proc_macro::TokenStream;
|
|
use quote::quote;
|
|
use syn::{parse_macro_input, Item, AttributeArgs, Meta, NestedMeta, Lit};
|
|
|
|
/// 实现#[clause_param]属性宏
|
|
pub fn clause_param_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
// 解析属性参数
|
|
let args = parse_macro_input!(attr as AttributeArgs);
|
|
let input = parse_macro_input!(item as Item);
|
|
|
|
let mut clause = None;
|
|
let mut description = None;
|
|
|
|
for arg in args {
|
|
if let NestedMeta::Meta(Meta::NameValue(nv)) = arg {
|
|
let path_str = nv.path.get_ident().map(|i| i.to_string());
|
|
|
|
match path_str.as_deref() {
|
|
Some("clause") => {
|
|
if let Lit::Str(lit) = &nv.lit {
|
|
clause = Some(lit.value());
|
|
}
|
|
}
|
|
Some("description") => {
|
|
if let Lit::Str(lit) = &nv.lit {
|
|
description = Some(lit.value());
|
|
}
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 生成文档注释
|
|
let doc_comment = if let (Some(clause_id), Some(desc)) = (clause, description) {
|
|
quote! {
|
|
#[doc = concat!("Constitutional parameter from clause: ", #clause_id)]
|
|
#[doc = ""]
|
|
#[doc = #desc]
|
|
}
|
|
} else {
|
|
quote! {}
|
|
};
|
|
|
|
// 生成最终代码
|
|
let expanded = quote! {
|
|
#doc_comment
|
|
#input
|
|
};
|
|
|
|
TokenStream::from(expanded)
|
|
}
|