attr_parser_fn/
opt_args.rs1use impl_variadics::impl_variadics;
2use syn::{
3 parse::{Parse, ParseStream},
4 token::Token,
5 Result,
6};
7
8use crate::with_comma;
9
10pub trait ParseOptionalArgs {
11 type Output;
12 fn parse(input: ParseStream) -> Result<Self::Output>;
13}
14
15impl_variadics! {
16 ..21 "T*" => {
17 impl<#(#T0,)*> ParseOptionalArgs for (#(#T0,)*)
18 where
19 #(#T0: Parse + Token,)*
20 {
21 type Output = (#(Option<#T0>,)*);
22
23 fn parse(_input: ParseStream) -> Result<Self::Output> {
24 #[allow(unused_mut)]
25 let mut output: Self::Output = (#(None,)*);
26
27 #(
28 match _input.parse::<Option<#T0>>()? {
29 v @ Some(_) => {
30 output.#index = v;
31 with_comma(_input)?;
32 },
33 None => return Ok(output),
34 }
35 )*
36
37 Ok(output)
38 }
39 }
40 }
41}