bluejay_validator/definition/
rules.rs

1mod enum_value_definition_uniqueness;
2mod input_field_definition_uniqueness;
3mod input_object_circular_references;
4
5pub use enum_value_definition_uniqueness::EnumValueDefinitionUniqueness;
6pub use input_field_definition_uniqueness::InputFieldDefinitionUniqueness;
7pub use input_object_circular_references::InputObjectCircularReferences;
8
9#[macro_export]
10macro_rules! combine_definition_rules {
11    ( $name:ty, $err:ty, [$( $rule:ty ),* $(,)?] $(,)? ) => {
12        paste::paste! {
13            pub struct $name<'a, S: bluejay_core::definition::SchemaDefinition> {
14                $([<$rule:snake>]: $rule<'a, S>,)*
15            }
16
17            impl<'a, S: bluejay_core::definition::SchemaDefinition + 'a> $crate::definition::Rule<'a, S> for $name<'a, S> {
18                type Error = $err<'a, S>;
19
20                fn new(schema_definition: &'a S) -> Self {
21                    Self {
22                        $([<$rule:snake>]: $rule::new(schema_definition),)*
23                    }
24                }
25            }
26
27            impl<'a, S: bluejay_core::definition::SchemaDefinition + 'a> IntoIterator for $name<'a, S> {
28                type Item = $err<'a, S>;
29                type IntoIter = $crate::chain_types!($(std::iter::Map<<$rule<'a, S> as IntoIterator>::IntoIter, fn(<$rule<'a, S> as $crate::definition::Rule<'a, S>>::Error) -> $err<'a, S>>),*);
30
31                fn into_iter(self) -> Self::IntoIter {
32                    $crate::chain_iters!($(self.[<$rule:snake>].into_iter().map(Into::into as fn(<$rule<'a, S> as $crate::definition::Rule<'a, S>>::Error) -> $err<'a, S>)),*)
33                }
34            }
35
36            impl<'a, S: bluejay_core::definition::SchemaDefinition> $crate::definition::Visitor<'a, S> for $name<'a, S> {
37                fn visit_input_object_type_definition(&mut self, input_object_type_definition: &'a S::InputObjectTypeDefinition) {
38                    $(self.[<$rule:snake>].visit_input_object_type_definition(input_object_type_definition);)*
39                }
40
41                fn visit_enum_type_definition(&mut self, enum_type_definition: &'a S::EnumTypeDefinition) {
42                    $(self.[<$rule:snake>].visit_enum_type_definition(enum_type_definition);)*
43                }
44            }
45        }
46    };
47}
48
49combine_definition_rules!(
50    BuiltinRules,
51    crate::definition::Error,
52    [
53        EnumValueDefinitionUniqueness,
54        InputFieldDefinitionUniqueness,
55        InputObjectCircularReferences,
56    ],
57);