bluejay_visibility/
type_definition.rs

1use crate::{
2    Cache, EnumTypeDefinition, InputObjectTypeDefinition, InterfaceTypeDefinition,
3    ObjectTypeDefinition, ScalarTypeDefinition, UnionTypeDefinition, Warden,
4};
5use bluejay_core::definition::{self, SchemaDefinition, TypeDefinitionReference};
6use bluejay_core::BuiltinScalarDefinition;
7use enum_as_inner::EnumAsInner;
8
9#[derive(EnumAsInner)]
10pub enum TypeDefinition<'a, S: SchemaDefinition, W: Warden<SchemaDefinition = S>> {
11    BuiltinScalar(BuiltinScalarDefinition),
12    CustomScalar(ScalarTypeDefinition<'a, S, W>),
13    Object(ObjectTypeDefinition<'a, S, W>),
14    Interface(InterfaceTypeDefinition<'a, S, W>),
15    InputObject(InputObjectTypeDefinition<'a, S, W>),
16    Enum(EnumTypeDefinition<'a, S, W>),
17    Union(UnionTypeDefinition<'a, S, W>),
18}
19
20impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> TypeDefinition<'a, S, W> {
21    pub(crate) fn new(
22        type_definition: TypeDefinitionReference<'a, S::TypeDefinition>,
23        cache: &'a Cache<'a, S, W>,
24    ) -> Option<Self> {
25        let warden = cache.warden();
26        match type_definition {
27            TypeDefinitionReference::BuiltinScalar(bstd) => Some(Self::BuiltinScalar(bstd)),
28            TypeDefinitionReference::CustomScalar(cstd) => warden
29                .is_custom_scalar_type_definition_visible(cstd)
30                .then(|| Self::CustomScalar(ScalarTypeDefinition::new(cstd, cache))),
31            TypeDefinitionReference::Object(otd) => warden
32                .is_object_type_definition_visible(otd)
33                .then(|| Self::Object(ObjectTypeDefinition::new(otd, cache))),
34            TypeDefinitionReference::Interface(itd) => warden
35                .is_interface_type_definition_visible(itd)
36                .then(|| Self::Interface(InterfaceTypeDefinition::new(itd, cache))),
37            TypeDefinitionReference::InputObject(iotd) => warden
38                .is_input_object_type_definition_visible(iotd)
39                .then(|| Self::InputObject(InputObjectTypeDefinition::new(iotd, cache))),
40            TypeDefinitionReference::Enum(etd) => warden
41                .is_enum_type_definition_visible(etd)
42                .then(|| Self::Enum(EnumTypeDefinition::new(etd, cache))),
43            TypeDefinitionReference::Union(utd) => warden
44                .is_union_type_definition_visible(utd)
45                .then(|| Self::Union(UnionTypeDefinition::new(utd, cache))),
46        }
47    }
48
49    pub(crate) fn inner(&self) -> TypeDefinitionReference<'_, S::TypeDefinition> {
50        match self {
51            Self::BuiltinScalar(bstd) => TypeDefinitionReference::BuiltinScalar(*bstd),
52            Self::CustomScalar(cstd) => TypeDefinitionReference::CustomScalar(cstd.inner()),
53            Self::Object(otd) => TypeDefinitionReference::Object(otd.inner()),
54            Self::Interface(itd) => TypeDefinitionReference::Interface(itd.inner()),
55            Self::InputObject(iotd) => TypeDefinitionReference::InputObject(iotd.inner()),
56            Self::Enum(etd) => TypeDefinitionReference::Enum(etd.inner()),
57            Self::Union(utd) => TypeDefinitionReference::Union(utd.inner()),
58        }
59    }
60}
61
62impl<'a, S: SchemaDefinition + 'a, W: Warden<SchemaDefinition = S>> definition::TypeDefinition
63    for TypeDefinition<'a, S, W>
64{
65    type ObjectTypeDefinition = ObjectTypeDefinition<'a, S, W>;
66    type InputObjectTypeDefinition = InputObjectTypeDefinition<'a, S, W>;
67    type CustomScalarTypeDefinition = ScalarTypeDefinition<'a, S, W>;
68    type InterfaceTypeDefinition = InterfaceTypeDefinition<'a, S, W>;
69    type EnumTypeDefinition = EnumTypeDefinition<'a, S, W>;
70    type UnionTypeDefinition = UnionTypeDefinition<'a, S, W>;
71
72    fn as_ref(&self) -> TypeDefinitionReference<'_, Self> {
73        match self {
74            Self::Object(otd) => TypeDefinitionReference::Object(otd),
75            Self::Interface(itd) => TypeDefinitionReference::Interface(itd),
76            Self::InputObject(iotd) => TypeDefinitionReference::InputObject(iotd),
77            Self::CustomScalar(cstd) => TypeDefinitionReference::CustomScalar(cstd),
78            Self::BuiltinScalar(bstd) => TypeDefinitionReference::BuiltinScalar(*bstd),
79            Self::Enum(etd) => TypeDefinitionReference::Enum(etd),
80            Self::Union(utd) => TypeDefinitionReference::Union(utd),
81        }
82    }
83}