attr_parser_fn/
opt_args.rs

1use 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}