sway-parse 0.16.0

Sway's parser
Documentation
use crate::priv_prelude::*;

macro_rules! define_brackets (
    ($ty_name:ident, $delimiter:ident, $error:ident) => {
        #[derive(Clone, Debug)]
        pub struct $ty_name<T> {
            inner: T,
            span: Span,
        }

        impl<T> $ty_name<T> {
            pub fn new<'a>(inner: T, span: Span, _consumed: ParserConsumed<'a>) -> $ty_name<T> {
                $ty_name {
                    inner,
                    span,
                }
            }

            pub fn get(&self) -> &T {
                &self.inner
            }

            pub fn into_inner(self) -> T {
                self.inner
            }
        }

        impl<T> Spanned for $ty_name<T> {
            fn span(&self) -> Span {
                self.span.clone()
            }
        }

        impl<T> $ty_name<T>
        where
            T: ParseToEnd,
        {
            pub fn try_parse(parser: &mut Parser) -> ParseResult<Option<$ty_name<T>>> {
                match parser.enter_delimited(Delimiter::$delimiter) {
                    Some((parser, span)) => {
                        let (inner, _consumed) = parser.parse_to_end()?;
                        Ok(Some($ty_name { inner, span }))
                    },
                    None => Ok(None),
                }
            }
        }

        impl<T> $ty_name<T>
        where
            T: Parse,
        {
            pub fn parse_all_inner(
                parser: &mut Parser,
                on_error: impl FnOnce(Parser) -> ErrorEmitted,
            ) -> ParseResult<$ty_name<T>> {
                match parser.enter_delimited(Delimiter::$delimiter) {
                    Some((mut parser, span)) => {
                        let inner = parser.parse()?;
                        if !parser.is_empty() {
                            return Err(on_error(parser))
                        }
                        Ok($ty_name { inner, span })
                    },
                    None => Err(parser.emit_error(ParseErrorKind::$error)),
                }
            }
        }

        impl<T> $ty_name<T>
        where
            T: Parse,
        {
            pub fn try_parse_all_inner(
                parser: &mut Parser,
                on_error: impl FnOnce(Parser) -> ErrorEmitted,
            ) -> ParseResult<Option<$ty_name<T>>> {
                match parser.enter_delimited(Delimiter::$delimiter) {
                    Some((mut parser, span)) => {
                        let inner = parser.parse()?;
                        if !parser.is_empty() {
                            return Err(on_error(parser))
                        }
                        Ok(Some($ty_name { inner, span }))
                    },
                    None => Ok(None),
                }
            }
        }

        impl<T> Parse for $ty_name<T>
        where
            T: ParseToEnd,
        {
            fn parse(parser: &mut Parser) -> ParseResult<$ty_name<T>> {
                match parser.enter_delimited(Delimiter::$delimiter) {
                    Some((parser, span)) => {
                        let (inner, _consumed) = parser.parse_to_end()?;
                        Ok($ty_name { inner, span })
                    },
                    None => Err(parser.emit_error(ParseErrorKind::$error)),
                }
            }
        }
    };
);

define_brackets!(Braces, Brace, ExpectedOpenBrace);
define_brackets!(Parens, Parenthesis, ExpectedOpenParen);
define_brackets!(SquareBrackets, Bracket, ExpectedOpenBracket);

#[derive(Clone, Debug)]
pub struct AngleBrackets<T> {
    pub open_angle_bracket_token: OpenAngleBracketToken,
    pub inner: T,
    pub close_angle_bracket_token: CloseAngleBracketToken,
}

impl<T> AngleBrackets<T> {
    pub fn into_inner(self) -> T {
        self.inner
    }
}

impl<T> Spanned for AngleBrackets<T> {
    fn span(&self) -> Span {
        Span::join(
            self.open_angle_bracket_token.span(),
            self.close_angle_bracket_token.span(),
        )
    }
}