bluejay_parser/ast/definition/
interface_implementation.rs

1use std::marker::PhantomData;
2
3use crate::ast::definition::{Context, InterfaceTypeDefinition};
4use crate::ast::{DepthLimiter, FromTokens, ParseError, Tokens};
5use crate::lexical_token::Name;
6use bluejay_core::definition::{
7    InterfaceImplementation as CoreInterfaceImplementation,
8    SchemaDefinition as CoreSchemaDefinition,
9};
10
11#[derive(Debug)]
12pub struct InterfaceImplementation<'a, C: Context + 'a> {
13    name: Name<'a>,
14    context: PhantomData<C>,
15}
16
17impl<'a, C: Context> CoreInterfaceImplementation for InterfaceImplementation<'a, C> {
18    type InterfaceTypeDefinition = InterfaceTypeDefinition<'a, C>;
19
20    fn interface<
21        'b,
22        S: CoreSchemaDefinition<InterfaceTypeDefinition = Self::InterfaceTypeDefinition>,
23    >(
24        &'b self,
25        schema_definition: &'b S,
26    ) -> &'b Self::InterfaceTypeDefinition {
27        schema_definition
28            .get_type_definition(self.interface_name().as_str())
29            .unwrap()
30            .as_interface()
31            .unwrap()
32    }
33
34    fn name(&self) -> &str {
35        self.name.as_str()
36    }
37}
38
39impl<'a, C: Context> InterfaceImplementation<'a, C> {
40    pub(crate) fn interface_name(&self) -> &Name<'a> {
41        &self.name
42    }
43}
44
45impl<'a, C: Context> FromTokens<'a> for InterfaceImplementation<'a, C> {
46    fn from_tokens(tokens: &mut impl Tokens<'a>, _: DepthLimiter) -> Result<Self, ParseError> {
47        tokens.expect_name().map(|name| Self {
48            name,
49            context: PhantomData,
50        })
51    }
52}