bluejay_visibility/
union_type_definition.rs

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