bluejay_visibility/
object_type_definition.rs1use 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}