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