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