bluejay_parser/ast/definition/
input_value_definition.rs1use 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}