bluejay_parser/ast/definition/
input_value_definition.rs

1use crate::ast::definition::{Context, Directives, InputType};
2use crate::ast::{ConstDirectives, ConstValue, 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(tokens: &mut impl Tokens<'a>) -> Result<Self, ParseError> {
44        let description = tokens.next_if_string_value();
45        let name = tokens.expect_name()?;
46        tokens.expect_punctuator(PunctuatorType::Colon)?;
47        let r#type = InputType::from_tokens(tokens)?;
48        let default_value: Option<ConstValue> =
49            if tokens.next_if_punctuator(PunctuatorType::Equals).is_some() {
50                Some(ConstValue::from_tokens(tokens)?)
51            } else {
52                None
53            };
54        let directives = Some(ConstDirectives::from_tokens(tokens)?);
55        Ok(Self {
56            description,
57            name,
58            r#type,
59            default_value,
60            directives: directives.map(Directives::from),
61        })
62    }
63}
64
65impl<'a, C: Context> HasDirectives for InputValueDefinition<'a, C> {
66    type Directives = Directives<'a, C>;
67
68    fn directives(&self) -> Option<&Self::Directives> {
69        self.directives.as_ref()
70    }
71}