use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
#[non_exhaustive]
pub enum CacheControl {
Ephemeral {
#[serde(default, skip_serializing_if = "Option::is_none")]
ttl: Option<String>,
},
}
impl CacheControl {
pub fn ephemeral() -> Self {
Self::Ephemeral { ttl: None }
}
pub fn ephemeral_ttl(ttl: impl Into<String>) -> Self {
Self::Ephemeral {
ttl: Some(ttl.into()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use serde_json::json;
#[test]
fn ephemeral_round_trips_without_ttl() {
let cc = CacheControl::ephemeral();
let v = serde_json::to_value(&cc).unwrap();
assert_eq!(v, json!({"type": "ephemeral"}));
let parsed: CacheControl = serde_json::from_value(v).unwrap();
assert_eq!(parsed, cc);
}
#[test]
fn ephemeral_round_trips_with_ttl() {
let cc = CacheControl::ephemeral_ttl("1h");
let v = serde_json::to_value(&cc).unwrap();
assert_eq!(v, json!({"type": "ephemeral", "ttl": "1h"}));
let parsed: CacheControl = serde_json::from_value(v).unwrap();
assert_eq!(parsed, cc);
}
}