macro_rules! unexpected {
($parser:expr_2021, $found:expr_2021, $expected:expr_2021 $(, $($t:tt)* )?) => {{
let __found: $crate::gql::token::Token = $found;
match __found.kind {
$crate::gql::token::TokenKind::Invalid => {
let __error = $parser.lexer.error.take().unwrap_or_else(|| {
$crate::syn::error::syntax_error!("Invalid token", @__found.span)
});
return Err(__error);
}
$crate::gql::token::TokenKind::Eof => {
let __error = $crate::syn::error::syntax_error!("Unexpected end of file, expected {}", $expected, @__found.span $( $($t)* )?);
return Err(__error);
}
x => {
$crate::syn::error::bail!("Unexpected token `{}`, expected {}", x, $expected, @__found.span $( $($t)* )?)
}
}
}};
}
macro_rules! expected {
($parser:expr_2021, $($kind:tt)*) => {{
let token: $crate::gql::token::Token = $parser.next();
if let $($kind)* = token.kind {
token
} else {
$crate::gql::parser::mac::unexpected!($parser, token, $($kind)*)
}
}};
}
macro_rules! enter_object_recursion {
($name:ident = $this:expr_2021 => { $($t:tt)* }) => {{
if $this.settings.object_recursion_limit == 0 {
return Err($crate::syn::error::SyntaxError::new(
"Exceeded query expression nesting depth limit",
)
.with_span($this.last_span(), $crate::syn::error::MessageKind::Error));
}
struct Dropper<'a, 'b>(&'a mut $crate::gql::parser::Parser<'b>);
impl Drop for Dropper<'_, '_> {
fn drop(&mut self) {
self.0.settings.object_recursion_limit += 1;
}
}
impl<'a> ::std::ops::Deref for Dropper<'_, 'a> {
type Target = $crate::gql::parser::Parser<'a>;
fn deref(&self) -> &Self::Target {
self.0
}
}
impl<'a> ::std::ops::DerefMut for Dropper<'_, 'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.0
}
}
$this.settings.object_recursion_limit -= 1;
let mut $name = Dropper($this);
{
$($t)*
}
}};
}
pub(crate) use enter_object_recursion;
pub(crate) use expected;
pub(crate) use unexpected;