turbo_tasks_macros_shared/
primitive_input.rs1use 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}