bluejay_validator/executable/
cache.rs1use 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}