1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/// Cache control values /// /// # Examples /// /// ```rust /// use async_graphql::*; /// /// struct QueryRoot; /// /// #[Object(cache_control(max_age = 60))] /// impl QueryRoot { /// #[field(cache_control(max_age = 30))] /// async fn value1(&self) -> i32 { /// 0 /// } /// /// #[field(cache_control(private))] /// async fn value2(&self) -> i32 { /// 0 /// } /// } /// /// #[async_std::main] /// async fn main() { /// let schema = Schema::new(QueryRoot, 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<String> { 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) }, } } }