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