///|
pub(all) struct RequestPolicy {
  bypass : Bool
  force_revalidation : Bool
  only_if_cached : Bool
  max_age : DeltaSeconds?
  min_fresh : DeltaSeconds
  max_stale : DeltaSeconds?
  max_stale_unbounded : Bool
} derive(Eq, Debug)

///|
pub fn evaluate_request_policy(request : RequestMeta) -> RequestPolicy {
  let directives = cache_control_from_headers(request.headers)
  RequestPolicy::{
    bypass: directives.no_store,
    force_revalidation: directives.no_cache ||
    request_has_legacy_no_cache(request.headers),
    only_if_cached: directives.only_if_cached,
    max_age: directives.max_age,
    min_fresh: directives.min_fresh.unwrap_or(DeltaSeconds::zero()),
    max_stale: directives.max_stale,
    max_stale_unbounded: directives.max_stale_unbounded,
  }
}

///|
pub fn RequestPolicy::allows_stale(
  self : RequestPolicy,
  stale_by : DeltaSeconds,
) -> Bool {
  self.max_stale_unbounded ||
  (match self.max_stale {
    Some(limit) => stale_by <= limit
    None => false
  })
}