/// Cache control values /// /// # Examples /// /// ```rust /// use async_graphql::*; /// /// struct Query; /// /// #[Object(cache_control(max_age = 60))] /// impl Query { /// #[graphql(cache_control(max_age = 30))] /// async fn value1(&self) -> i32 { /// 0 /// } /// /// #[graphql(cache_control(private))] /// async fn value2(&self) -> i32 { /// 0 /// } /// } /// /// # tokio::runtime::Runtime::new().unwrap().block_on(async { /// let schema = Schema::new(Query, EmptyMutation, EmptySubscription); /// assert_eq!( /// schema /// .execute("{ value1 }") /// .await /// .into_result() /// .unwrap() /// .cache_control, /// CacheControl { /// public: true, /// max_age: 30 /// } /// ); /// assert_eq!( /// schema /// .execute("{ value2 }") /// .await /// .into_result() /// .unwrap() /// .cache_control, /// CacheControl { /// public: false, /// max_age: 60 /// } /// ); /// assert_eq!( /// schema /// .execute("{ value1 value2 }") /// .await /// .into_result() /// .unwrap() /// .cache_control, /// CacheControl { /// public: false, /// max_age: 30 /// } /// ); /// # }); /// ``` #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct CacheControl { /// Scope is public, default is true. pub public: bool, /// Cache max age, default is 0. pub max_age: usize, } impl Default for CacheControl { fn default() -> Self { Self { public: true, max_age: 0, } } } impl CacheControl { /// Get 'Cache-Control' header value. #[must_use] pub fn value(&self) -> Option { if self.max_age > 0 { Some(format!( "max-age={}{}", self.max_age, if self.public { "" } else { ", private" } )) } else { None } } } impl CacheControl { #[must_use] pub(crate) fn merge(self, other: &CacheControl) -> CacheControl { CacheControl { public: self.public && other.public, max_age: if self.max_age == 0 { other.max_age } else if other.max_age == 0 { self.max_age } else { self.max_age.min(other.max_age) }, } } }