turbo_tasks_macros_shared/
primitive_input.rs

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