turbo_tasks_macros_shared/
primitive_input.rs

1use proc_macro2::Span;
2use syn::{
3    Meta, Result, Token, Type,
4    parse::{Parse, ParseStream},
5    spanned::Spanned,
6};
7
8#[derive(Debug)]
9pub struct PrimitiveInput {
10    pub ty: Type,
11    pub manual_shrink_to_fit: Option<Span>,
12}
13
14impl Parse for PrimitiveInput {
15    fn parse(input: ParseStream) -> Result<Self> {
16        let ty: Type = input.parse()?;
17        let mut parsed_input = PrimitiveInput {
18            ty,
19            manual_shrink_to_fit: None,
20        };
21        if input.parse::<Option<Token![,]>>()?.is_some() {
22            let punctuated = input.parse_terminated(Meta::parse, Token![,])?;
23            for meta in punctuated {
24                match (
25                    meta.path()
26                        .get_ident()
27                        .map(ToString::to_string)
28                        .as_deref()
29                        .unwrap_or_default(),
30                    &meta,
31                ) {
32                    ("manual_shrink_to_fit", Meta::Path(_)) => {
33                        parsed_input.manual_shrink_to_fit = Some(meta.span())
34                    }
35                    (_, meta) => {
36                        return Err(syn::Error::new_spanned(
37                            meta,
38                            "unexpected token, expected: \"manual_shrink_to_fit\"",
39                        ));
40                    }
41                }
42            }
43        }
44        Ok(parsed_input)
45    }
46}