1 use crate::error::{Error, Result};
2 use crate::iter::Iter;
3 use proc_macro::{Delimiter, Group, Ident, Literal, Span, TokenTree};
4 
parse_punct(iter: Iter, ch: char) -> Result<()>5 pub fn parse_punct(iter: Iter, ch: char) -> Result<()> {
6     match iter.next() {
7         Some(TokenTree::Punct(ref punct)) if punct.as_char() == ch => Ok(()),
8         unexpected => {
9             let span = unexpected
10                 .as_ref()
11                 .map_or_else(Span::call_site, TokenTree::span);
12             Err(Error::new(span, format!("expected `{}`", ch)))
13         }
14     }
15 }
16 
parse_optional_punct(iter: Iter, ch: char) -> Option<()>17 pub fn parse_optional_punct(iter: Iter, ch: char) -> Option<()> {
18     match iter.peek() {
19         Some(TokenTree::Punct(punct)) if punct.as_char() == ch => iter.next().map(drop),
20         _ => None,
21     }
22 }
23 
parse_optional_keyword(iter: Iter, keyword: &str) -> Option<Span>24 pub fn parse_optional_keyword(iter: Iter, keyword: &str) -> Option<Span> {
25     match iter.peek() {
26         Some(TokenTree::Ident(ident)) if ident.to_string() == keyword => {
27             Some(iter.next().unwrap().span())
28         }
29         _ => None,
30     }
31 }
32 
parse_literal(iter: Iter) -> Result<Literal>33 pub fn parse_literal(iter: Iter) -> Result<Literal> {
34     match iter.next() {
35         Some(TokenTree::Literal(literal)) => Ok(literal),
36         unexpected => {
37             let span = unexpected
38                 .as_ref()
39                 .map_or_else(Span::call_site, TokenTree::span);
40             Err(Error::new(span, "expected literal"))
41         }
42     }
43 }
44 
parse_paren(introducer: &Ident, iter: Iter) -> Result<Group>45 pub fn parse_paren(introducer: &Ident, iter: Iter) -> Result<Group> {
46     match iter.peek() {
47         Some(TokenTree::Group(group)) if group.delimiter() == Delimiter::Parenthesis => {
48             match iter.next() {
49                 Some(TokenTree::Group(group)) => Ok(group),
50                 _ => unreachable!(),
51             }
52         }
53         Some(unexpected) => Err(Error::new(unexpected.span(), "expected `(`")),
54         None => Err(Error::new(
55             introducer.span(),
56             format!("expected `(` after `{}`", introducer),
57         )),
58     }
59 }
60 
parse_optional_paren(iter: Iter) -> Option<Group>61 pub fn parse_optional_paren(iter: Iter) -> Option<Group> {
62     match iter.peek() {
63         Some(TokenTree::Group(group)) if group.delimiter() == Delimiter::Parenthesis => {
64             match iter.next() {
65                 Some(TokenTree::Group(group)) => Some(group),
66                 _ => unreachable!(),
67             }
68         }
69         _ => None,
70     }
71 }
72 
parse_end(iter: Iter) -> Result<()>73 pub fn parse_end(iter: Iter) -> Result<()> {
74     match iter.next() {
75         None => Ok(()),
76         Some(unexpected) => Err(Error::new(unexpected.span(), "unexpected token")),
77     }
78 }
79