bluejay_validator/executable/
cache.rs

1use crate::executable::document::VariableDefinitionInputType;
2use bluejay_core::definition::SchemaDefinition;
3use bluejay_core::executable::{
4    ExecutableDocument, FragmentDefinition, OperationDefinition, VariableDefinition,
5};
6use bluejay_core::{AsIter, Indexed};
7use std::collections::HashMap;
8
9pub struct Cache<'a, E: ExecutableDocument, S: SchemaDefinition> {
10    variable_definition_input_types:
11        HashMap<Indexed<'a, E::VariableType>, VariableDefinitionInputType<'a, S::InputType>>,
12    indexed_fragment_definitions: HashMap<&'a str, &'a E::FragmentDefinition>,
13}
14
15impl<'a, E: ExecutableDocument, S: SchemaDefinition> Cache<'a, E, S> {
16    pub fn new(executable_document: &'a E, schema_definition: &'a S) -> Self {
17        let variable_definition_input_types =
18            HashMap::from_iter(executable_document.operation_definitions().flat_map(
19                |operation_definition: &'a E::OperationDefinition| {
20                    let variable_definitions_iterator = operation_definition
21                        .as_ref()
22                        .variable_definitions()
23                        .map(|variable_definitions: &'a E::VariableDefinitions| -> <E::VariableDefinitions as AsIter>::Iterator<'a> {
24                            variable_definitions.iter()
25                        });
26
27                    variable_definitions_iterator
28                        .into_iter()
29                        .flatten()
30                        .filter_map(|variable_definition| {
31                            let variable_type = variable_definition.r#type();
32                            VariableDefinitionInputType::try_from((
33                                schema_definition,
34                                variable_type,
35                            ))
36                            .ok()
37                            .map(|vdit| (Indexed(variable_type), vdit))
38                        })
39                },
40            ));
41        let indexed_fragment_definitions = HashMap::from_iter(
42            executable_document
43                .fragment_definitions()
44                .map(|fragment_definition| (fragment_definition.name(), fragment_definition)),
45        );
46        Self {
47            variable_definition_input_types,
48            indexed_fragment_definitions,
49        }
50    }
51
52    pub fn variable_definition_input_type(
53        &self,
54        variable_type: &'a E::VariableType,
55    ) -> Option<&VariableDefinitionInputType<'a, S::InputType>> {
56        self.variable_definition_input_types
57            .get(&Indexed(variable_type))
58    }
59
60    pub fn fragment_definition(&self, name: &str) -> Option<&'a E::FragmentDefinition> {
61        self.indexed_fragment_definitions.get(name).copied()
62    }
63}