bluejay_visibility/
interface_implementation.rs

1use 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}