bluejay_visibility/
object_type_definition.rs

1use crate::{Cache, Directives, FieldsDefinition, InterfaceImplementations, Warden};
2use bluejay_core::definition::{self, HasDirectives, SchemaDefinition};
3use once_cell::unsync::OnceCell;
4
5pub struct ObjectTypeDefinition<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> {
6    inner: &'a S::ObjectTypeDefinition,
7    cache: &'a Cache<'a, S, W>,
8    fields_definition: OnceCell<FieldsDefinition<'a, S, W>>,
9    interface_implementations: OnceCell<Option<InterfaceImplementations<'a, S, W>>>,
10    directives: Option<Directives<'a, S, W>>,
11}
12
13impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> ObjectTypeDefinition<'a, S, W> {
14    pub(crate) fn new(inner: &'a S::ObjectTypeDefinition, cache: &'a Cache<'a, S, W>) -> Self {
15        Self {
16            inner,
17            cache,
18            fields_definition: OnceCell::new(),
19            interface_implementations: OnceCell::new(),
20            directives: inner.directives().map(|d| Directives::new(d, cache)),
21        }
22    }
23
24    pub fn inner(&self) -> &'a S::ObjectTypeDefinition {
25        self.inner
26    }
27}
28
29impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> definition::ObjectTypeDefinition
30    for ObjectTypeDefinition<'a, S, W>
31{
32    type FieldsDefinition = FieldsDefinition<'a, S, W>;
33    type InterfaceImplementations = InterfaceImplementations<'a, S, W>;
34
35    fn description(&self) -> Option<&str> {
36        self.inner.description()
37    }
38
39    fn name(&self) -> &str {
40        self.inner.name()
41    }
42
43    fn fields_definition(&self) -> &Self::FieldsDefinition {
44        self.fields_definition
45            .get_or_init(|| FieldsDefinition::new(self.inner.fields_definition(), self.cache))
46    }
47
48    fn interface_implementations(&self) -> Option<&Self::InterfaceImplementations> {
49        self.interface_implementations
50            .get_or_init(|| {
51                self.inner
52                    .interface_implementations()
53                    .map(|ii| InterfaceImplementations::new(ii, self.cache))
54            })
55            .as_ref()
56    }
57
58    fn is_builtin(&self) -> bool {
59        self.inner.is_builtin()
60    }
61}
62
63impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> HasDirectives
64    for ObjectTypeDefinition<'a, S, W>
65{
66    type Directives = Directives<'a, S, W>;
67
68    fn directives(&self) -> Option<&Self::Directives> {
69        self.directives.as_ref()
70    }
71}