bluejay_parser/ast/definition/
input_value_definition.rs

1use crate::ast::definition::{Context, Directives, InputType};
2use crate::ast::{ConstDirectives, ConstValue, DepthLimiter, FromTokens, ParseError, Tokens};
3use crate::lexical_token::{Name, PunctuatorType, StringValue};
4use bluejay_core::definition::{HasDirectives, InputValueDefinition as CoreInputValueDefinition};
5
6#[derive(Debug)]
7pub struct InputValueDefinition<'a, C: Context> {
8    description: Option<StringValue<'a>>,
9    name: Name<'a>,
10    r#type: InputType<'a, C>,
11    default_value: Option<ConstValue<'a>>,
12    directives: Option<Directives<'a, C>>,
13}
14
15impl<'a, C: Context> InputValueDefinition<'a, C> {
16    pub fn name_token(&self) -> &Name<'a> {
17        &self.name
18    }
19}
20
21impl<'a, C: Context> CoreInputValueDefinition for InputValueDefinition<'a, C> {
22    type InputType = InputType<'a, C>;
23    type Value = ConstValue<'a>;
24
25    fn description(&self) -> Option<&str> {
26        self.description.as_ref().map(AsRef::as_ref)
27    }
28
29    fn name(&self) -> &str {
30        self.name.as_ref()
31    }
32
33    fn r#type(&self) -> &Self::InputType {
34        &self.r#type
35    }
36
37    fn default_value(&self) -> Option<&Self::Value> {
38        self.default_value.as_ref()
39    }
40}
41
42impl<'a, C: Context> FromTokens<'a> for InputValueDefinition<'a, C> {
43    fn from_tokens(
44        tokens: &mut impl Tokens<'a>,
45        depth_limiter: DepthLimiter,
46    ) -> Result<Self, ParseError> {
47        let description = tokens.next_if_string_value();
48        let name = tokens.expect_name()?;
49        tokens.expect_punctuator(PunctuatorType::Colon)?;
50        let r#type = InputType::from_tokens(tokens, depth_limiter.bump()?)?;
51        let default_value: Option<ConstValue> =
52            if tokens.next_if_punctuator(PunctuatorType::Equals).is_some() {
53                Some(ConstValue::from_tokens(tokens, depth_limiter.bump()?)?)
54            } else {
55                None
56            };
57        let directives = Some(ConstDirectives::from_tokens(tokens, depth_limiter.bump()?)?);
58        Ok(Self {
59            description,
60            name,
61            r#type,
62            default_value,
63            directives: directives.map(Directives::from),
64        })
65    }
66}
67
68impl<'a, C: Context> HasDirectives for InputValueDefinition<'a, C> {
69    type Directives = Directives<'a, C>;
70
71    fn directives(&self) -> Option<&Self::Directives> {
72        self.directives.as_ref()
73    }
74}