이 프로그램에 사용된 모든 라이브러리 제작자에게 감사합니다.
pub struct MetaNameValue {
pub path: Path,
pub eq_token: Token![=],
pub value: Expr,
}
pub enum Expr {
Array(ExprArray),
Async(ExprAsync),
Await(ExprAwait),
If(ExprIf),
Let(ExprLet),
Lit(ExprLit),
Loop(ExprLoop),
Macro(ExprMacro),
Match(ExprMatch),
Path(ExprPath),
Return(ExprReturn),
Struct(ExprStruct),
Unsafe(ExprUnsafe),
Verbatim(TokenStream),
While(ExprWhile),
}
----------------------------------------------------
let name_value: syn::MetaNameValue = input.parse()?;
match &name_value.value.Lit(ExprLit) {
syn::Lit::Int(expr) => {
if threads.is_some() {
return Err(syn::Error::new_spanned(
name_value,
"multiple threads argments",
));
}
let num = expr.base10_parse::<std::num::NonZeroU32>()?;
threads = Some((num.get(), expr.span()));
}
_ => {
}
}
match &*ident.to_string().to_lowercase() {
"threads" => match &name_value.value {
syn::Expr::Lit (lit) => {
syn::Lit::Int(expr) => {
if threads.is_some() {
return Err(syn::Error::new_spanned(
name_value,
"multiple threads argments",
));
}
let num = expr.base10_parse::<std::num::NonZeroU32>()?;
threads = Some((num.get(), expr.span()));
},
_ => {
return Err(syn::Error::new_spanned(
name_value,
"threads argument must be an integer",
))
}
}
},