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);