async_graphql/validation/visitors/
cache_control.rs

1use 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(&registry_field.cache_control);
33        }
34    }
35}