bluejay-parser 0.3.1

A GraphQL parser
Documentation
use crate::ast::{DepthLimiter, FromTokens, IsMatch, ParseError, Tokens};
use crate::{HasSpan, Span};

#[derive(Debug)]
pub struct OperationType {
    inner: bluejay_core::OperationType,
    span: Span,
}

impl HasSpan for OperationType {
    fn span(&self) -> &Span {
        &self.span
    }
}

impl From<&OperationType> for bluejay_core::OperationType {
    fn from(value: &OperationType) -> Self {
        value.inner
    }
}

impl<'a> FromTokens<'a> for OperationType {
    #[inline]
    fn from_tokens(tokens: &mut impl Tokens<'a>, _: DepthLimiter) -> Result<Self, ParseError> {
        tokens.expect_name().and_then(|name| {
            match bluejay_core::OperationType::try_from(name.as_str()) {
                Ok(operation_type) => Ok(Self {
                    inner: operation_type,
                    span: name.into(),
                }),
                Err(_) => Err(ParseError::ExpectedOneOf {
                    span: name.into(),
                    values: bluejay_core::OperationType::POSSIBLE_VALUES,
                }),
            }
        })
    }
}

impl<'a> IsMatch<'a> for OperationType {
    #[inline]
    fn is_match(tokens: &mut impl Tokens<'a>) -> bool {
        bluejay_core::OperationType::POSSIBLE_VALUES
            .iter()
            .any(|value| tokens.peek_name_matches(0, value))
    }
}