sway_parse/
brackets.rs

1use crate::{Parse, ParseResult, ParseToEnd, Parser};
2
3use sway_ast::brackets::{Braces, Parens, SquareBrackets};
4use sway_error::handler::ErrorEmitted;
5use sway_error::parser_error::ParseErrorKind;
6use sway_types::ast::Delimiter;
7
8pub trait ParseBracket<T>: Sized {
9    fn try_parse(parser: &mut Parser) -> ParseResult<Option<Self>>
10    where
11        T: ParseToEnd;
12
13    fn parse_all_inner(
14        parser: &mut Parser,
15        on_error: impl FnOnce(Parser) -> ErrorEmitted,
16    ) -> ParseResult<Self>
17    where
18        T: Parse;
19
20    fn try_parse_all_inner(
21        parser: &mut Parser,
22        on_error: impl FnOnce(Parser) -> ErrorEmitted,
23    ) -> ParseResult<Option<Self>>
24    where
25        T: Parse;
26}
27
28macro_rules! impl_brackets (
29    ($ty_name:ident, $delimiter:ident, $error:ident) => {
30        impl<T> ParseBracket<T> for $ty_name<T> {
31            fn try_parse(parser: &mut Parser) -> ParseResult<Option<$ty_name<T>>>
32            where
33                T: ParseToEnd
34            {
35                match parser.enter_delimited(Delimiter::$delimiter) {
36                    Some((parser, span)) => {
37                        let (inner, _consumed) = parser.parse_to_end()?;
38                        Ok(Some($ty_name { inner, span }))
39                    },
40                    None => Ok(None),
41                }
42            }
43
44            fn parse_all_inner(
45                parser: &mut Parser,
46                on_error: impl FnOnce(Parser) -> ErrorEmitted,
47            ) -> ParseResult<$ty_name<T>>
48            where
49                T: Parse
50            {
51                match parser.enter_delimited(Delimiter::$delimiter) {
52                    Some((mut parser, span)) => {
53                        let inner = parser.parse()?;
54                        if !parser.is_empty() {
55                            return Err(on_error(parser))
56                        }
57                        Ok($ty_name { inner, span })
58                    },
59                    None => Err(parser.emit_error(ParseErrorKind::$error)),
60                }
61            }
62
63            fn try_parse_all_inner(
64                parser: &mut Parser,
65                on_error: impl FnOnce(Parser) -> ErrorEmitted,
66            ) -> ParseResult<Option<$ty_name<T>>>
67            where
68                T: Parse
69            {
70                match parser.enter_delimited(Delimiter::$delimiter) {
71                    Some((mut parser, span)) => {
72                        let inner = parser.parse()?;
73                        if !parser.is_empty() {
74                            return Err(on_error(parser))
75                        }
76                        Ok(Some($ty_name { inner, span }))
77                    },
78                    None => Ok(None),
79                }
80            }
81        }
82
83        impl<T> Parse for $ty_name<T>
84        where
85            T: ParseToEnd,
86        {
87            fn parse(parser: &mut Parser) -> ParseResult<$ty_name<T>> {
88                match parser.enter_delimited(Delimiter::$delimiter) {
89                    Some((parser, span)) => {
90                        let (inner, _consumed) = parser.parse_to_end()?;
91                        Ok($ty_name { inner, span })
92                    },
93                    None => Err(parser.emit_error(ParseErrorKind::$error)),
94                }
95            }
96        }
97    };
98);
99
100impl_brackets!(Braces, Brace, ExpectedOpenBrace);
101impl_brackets!(Parens, Parenthesis, ExpectedOpenParen);
102impl_brackets!(SquareBrackets, Bracket, ExpectedOpenBracket);