bluejay_visibility/
union_member_type.rs

1use crate::{Cache, ObjectTypeDefinition, Warden};
2use bluejay_core::definition::{self, SchemaDefinition, TypeDefinitionReference};
3
4pub struct UnionMemberType<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> {
5    inner: &'a S::UnionMemberType,
6    member_type: &'a ObjectTypeDefinition<'a, S, W>,
7}
8
9impl<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> UnionMemberType<'a, S, W> {
10    pub(crate) fn new(inner: &'a S::UnionMemberType, cache: &'a Cache<'a, S, W>) -> Option<Self> {
11        cache
12            .warden()
13            .is_union_member_type_visible(inner)
14            .then(|| {
15                cache
16                    .get_or_create_type_definition(TypeDefinitionReference::Object(
17                        definition::UnionMemberType::member_type(
18                            inner,
19                            cache.inner_schema_definition(),
20                        ),
21                    ))
22                    .map(|td| Self {
23                        inner,
24                        member_type: td.as_object().unwrap(),
25                    })
26            })
27            .flatten()
28    }
29
30    pub fn inner(&self) -> &'a S::UnionMemberType {
31        self.inner
32    }
33
34    pub(crate) fn member_type(&self) -> &'a ObjectTypeDefinition<'a, S, W> {
35        self.member_type
36    }
37}
38
39impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> definition::UnionMemberType
40    for UnionMemberType<'a, S, W>
41{
42    type ObjectTypeDefinition = ObjectTypeDefinition<'a, S, W>;
43
44    fn member_type<'b, S2: SchemaDefinition<ObjectTypeDefinition = Self::ObjectTypeDefinition>>(
45        &'b self,
46        _: &'b S2,
47    ) -> &'b Self::ObjectTypeDefinition {
48        self.member_type
49    }
50
51    fn name(&self) -> &str {
52        self.inner.name()
53    }
54}