bluejay_parser/ast/executable/
executable_definition.rs

1use crate::ast::executable::{FragmentDefinition, OperationDefinition};
2use crate::ast::{DepthLimiter, FromTokens, IsMatch, ParseError, Tokens};
3
4#[derive(Debug)]
5pub enum ExecutableDefinition<'a> {
6    Operation(OperationDefinition<'a>),
7    Fragment(FragmentDefinition<'a>),
8}
9
10impl<'a> FromTokens<'a> for ExecutableDefinition<'a> {
11    #[inline]
12    fn from_tokens(
13        tokens: &mut impl Tokens<'a>,
14        depth_limiter: DepthLimiter,
15    ) -> Result<Self, ParseError> {
16        // don't bump depth limiters because this is just a thin wrapper in the AST
17        if OperationDefinition::is_match(tokens) {
18            OperationDefinition::from_tokens(tokens, depth_limiter).map(Self::Operation)
19        } else if FragmentDefinition::is_match(tokens) {
20            FragmentDefinition::from_tokens(tokens, depth_limiter).map(Self::Fragment)
21        } else {
22            Err(tokens.unexpected_token())
23        }
24    }
25}
26
27impl<'a> IsMatch<'a> for ExecutableDefinition<'a> {
28    #[inline]
29    fn is_match(tokens: &mut impl Tokens<'a>) -> bool {
30        OperationDefinition::is_match(tokens) || FragmentDefinition::is_match(tokens)
31    }
32}