bluejay_visibility/
union_type_definition.rs1use crate::{Cache, Directives, FieldsDefinition, UnionMemberTypes, Warden};
2use bluejay_core::definition::{self, HasDirectives, SchemaDefinition};
3use once_cell::unsync::OnceCell;
4
5pub struct UnionTypeDefinition<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> {
6 inner: &'a S::UnionTypeDefinition,
7 cache: &'a Cache<'a, S, W>,
8 union_member_types: OnceCell<UnionMemberTypes<'a, S, W>>,
9 fields_definition: OnceCell<FieldsDefinition<'a, S, W>>,
10 directives: Option<Directives<'a, S, W>>,
11}
12
13impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> UnionTypeDefinition<'a, S, W> {
14 pub(crate) fn new(inner: &'a S::UnionTypeDefinition, cache: &'a Cache<'a, S, W>) -> Self {
15 Self {
16 inner,
17 cache,
18 union_member_types: OnceCell::new(),
19 fields_definition: OnceCell::new(),
20 directives: HasDirectives::directives(inner).map(|d| Directives::new(d, cache)),
21 }
22 }
23
24 pub fn inner(&self) -> &'a S::UnionTypeDefinition {
25 self.inner
26 }
27}
28
29impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> definition::UnionTypeDefinition
30 for UnionTypeDefinition<'a, S, W>
31{
32 type UnionMemberTypes = UnionMemberTypes<'a, S, W>;
33 type FieldsDefinition = FieldsDefinition<'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 union_member_types(&self) -> &Self::UnionMemberTypes {
44 self.union_member_types
45 .get_or_init(|| UnionMemberTypes::new(self.inner.union_member_types(), self.cache))
46 }
47
48 fn fields_definition(&self) -> &Self::FieldsDefinition {
49 self.fields_definition
50 .get_or_init(|| FieldsDefinition::new(self.inner.fields_definition(), self.cache))
51 }
52}
53
54impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> HasDirectives
55 for UnionTypeDefinition<'a, S, W>
56{
57 type Directives = Directives<'a, S, W>;
58
59 fn directives(&self) -> Option<&Self::Directives> {
60 self.directives.as_ref()
61 }
62}