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