async_graphql/validation/visitors/
cache_control.rs1use crate::{
2 parser::types::{Field, SelectionSet},
3 registry::MetaType,
4 validation::visitor::{VisitMode, Visitor, VisitorContext},
5 CacheControl, Positioned,
6};
7
8pub struct CacheControlCalculate<'a> {
9 pub cache_control: &'a mut CacheControl,
10}
11
12impl Visitor<'_> for CacheControlCalculate<'_> {
13 fn mode(&self) -> VisitMode {
14 VisitMode::Inline
15 }
16
17 fn enter_selection_set(
18 &mut self,
19 ctx: &mut VisitorContext<'_>,
20 _selection_set: &Positioned<SelectionSet>,
21 ) {
22 if let Some(MetaType::Object { cache_control, .. }) = ctx.current_type() {
23 *self.cache_control = self.cache_control.merge(cache_control);
24 }
25 }
26
27 fn enter_field(&mut self, ctx: &mut VisitorContext<'_>, field: &Positioned<Field>) {
28 if let Some(registry_field) = ctx
29 .parent_type()
30 .and_then(|parent| parent.field_by_name(&field.node.name.node))
31 {
32 *self.cache_control = self.cache_control.merge(®istry_field.cache_control);
33 }
34 }
35}