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