2020-09-14 00:37:15 +00:00
|
|
|
/// Cache control values
|
|
|
|
///
|
|
|
|
/// # Examples
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// use async_graphql::*;
|
|
|
|
///
|
|
|
|
/// struct QueryRoot;
|
|
|
|
///
|
2020-09-18 00:52:13 +00:00
|
|
|
/// #[Object(cache_control(max_age = 60))]
|
2020-09-14 00:37:15 +00:00
|
|
|
/// impl QueryRoot {
|
2020-09-28 09:44:00 +00:00
|
|
|
/// #[graphql(cache_control(max_age = 30))]
|
2020-09-14 00:37:15 +00:00
|
|
|
/// async fn value1(&self) -> i32 {
|
|
|
|
/// 0
|
|
|
|
/// }
|
|
|
|
///
|
2020-09-28 09:44:00 +00:00
|
|
|
/// #[graphql(cache_control(private))]
|
2020-09-14 00:37:15 +00:00
|
|
|
/// async fn value2(&self) -> i32 {
|
|
|
|
/// 0
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
2021-03-12 04:47:24 +00:00
|
|
|
/// tokio::runtime::Runtime::new().unwrap().block_on(async {
|
2020-09-14 00:37:15 +00:00
|
|
|
/// 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 });
|
2021-03-12 04:47:24 +00:00
|
|
|
/// });
|
2020-09-14 00:37:15 +00:00
|
|
|
/// ```
|
|
|
|
#[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 {
|
2020-09-17 08:39:55 +00:00
|
|
|
#[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)
|
|
|
|
},
|
|
|
|
}
|
2020-09-14 00:37:15 +00:00
|
|
|
}
|
|
|
|
}
|