worktable_codegen/worktable/parser/
punct.rs

1use proc_macro2::TokenTree;
2use syn::spanned::Spanned;
3
4use crate::worktable::parser::Parser;
5
6impl Parser {
7    /// Parses ':' from [`proc_macro2::TokenStream`].
8    pub fn parse_colon(&mut self) -> syn::Result<()> {
9        let iter = &mut self.input_iter;
10
11        let colon = iter
12            .next()
13            .ok_or(syn::Error::new(self.input.span(), "Expected token."))?;
14        if let TokenTree::Punct(colon) = colon {
15            if colon.as_char() != ':' {
16                return Err(syn::Error::new(
17                    colon.span(),
18                    format!("Expected `:` found: `{}`", colon.as_char()),
19                ));
20            }
21
22            Ok(())
23        } else {
24            Err(syn::Error::new(colon.span(), "Expected `:`."))
25        }
26    }
27
28    /// Tries to parse ',' from [`TokenStream`] without calling `next` on wrong token.
29    pub fn try_parse_comma(&mut self) -> syn::Result<()> {
30        let iter = &mut self.input_iter;
31
32        if let Some(colon) = iter.peek() {
33            if comma(colon).is_ok() {
34                iter.next();
35            }
36        }
37
38        Ok(())
39    }
40}
41
42fn comma(tt: &TokenTree) -> syn::Result<()> {
43    if let TokenTree::Punct(colon) = tt {
44        if colon.as_char() != ',' {
45            return Err(syn::Error::new(
46                colon.span(),
47                format!("Expected `,` found: `{}`", colon.as_char()),
48            ));
49        }
50
51        Ok(())
52    } else {
53        Err(syn::Error::new(tt.span(), "Expected `,`."))
54    }
55}