use crate::{
parser::{
token::{
CloseParen,
OpenParen,
CloseCurly,
OpenCurly,
CloseSquare,
OpenSquare,
},
Parse,
},
tokenizer::TokenKind,
};
pub trait Pair {
type Open<'source>: Parse<'source>;
type Close<'source>: Parse<'source>;
const OPEN: TokenKind;
const CLOSE: TokenKind;
}
macro_rules! pairs {
($($open:ident $close:ident),* $(,)?) => {
$(
impl Pair for $open<'_> {
type Open<'source> = $open<'source>;
type Close<'source> = $close<'source>;
const OPEN: TokenKind = TokenKind::$open;
const CLOSE: TokenKind = TokenKind::$close;
}
impl Pair for $close<'_> {
type Open<'source> = $open<'source>;
type Close<'source> = $close<'source>;
const OPEN: TokenKind = TokenKind::$open;
const CLOSE: TokenKind = TokenKind::$close;
}
)*
}
}
pairs!(
OpenParen CloseParen,
OpenCurly CloseCurly,
OpenSquare CloseSquare,
);