bluejay_visibility/
interface_implementation.rs1use crate::{Cache, InterfaceTypeDefinition, Warden};
2use bluejay_core::definition::{self, prelude::*, SchemaDefinition, TypeDefinitionReference};
3
4pub struct InterfaceImplementation<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> {
5 inner: &'a S::InterfaceImplementation,
6 interface: &'a InterfaceTypeDefinition<'a, S, W>,
7}
8
9impl<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> InterfaceImplementation<'a, S, W> {
10 pub(crate) fn new(
11 inner: &'a S::InterfaceImplementation,
12 cache: &'a Cache<'a, S, W>,
13 ) -> Option<Self> {
14 cache
15 .warden()
16 .is_interface_implementation_visible(inner)
17 .then(|| {
18 cache
19 .get_or_create_type_definition(TypeDefinitionReference::Interface(
20 definition::InterfaceImplementation::interface(
21 inner,
22 cache.inner_schema_definition(),
23 ),
24 ))
25 .map(|td| Self {
26 inner,
27 interface: td.as_interface().unwrap(),
28 })
29 })
30 .flatten()
31 }
32
33 pub fn inner(&self) -> &'a S::InterfaceImplementation {
34 self.inner
35 }
36
37 pub(crate) fn interface(&self) -> &'a InterfaceTypeDefinition<'a, S, W> {
38 self.interface
39 }
40}
41
42impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>>
43 definition::InterfaceImplementation for InterfaceImplementation<'a, S, W>
44{
45 type InterfaceTypeDefinition = InterfaceTypeDefinition<'a, S, W>;
46
47 fn interface<
48 'b,
49 S2: SchemaDefinition<InterfaceTypeDefinition = Self::InterfaceTypeDefinition>,
50 >(
51 &'b self,
52 _: &'b S2,
53 ) -> &'b Self::InterfaceTypeDefinition {
54 self.interface
55 }
56
57 fn name(&self) -> &str {
58 self.interface.name()
59 }
60}