///|
fn main {
  let original_request = @cache.request(
    "GET",
    "https://api.example.test/catalog",
    headers=@cache.Headers::empty().add("accept-language", "zh-CN"),
  )
  let origin_response = @cache.response(
    200,
    headers=@cache.Headers::empty()
      .add("cache-control", "public, max-age=120")
      .add("vary", "accept-language")
      .add("etag", "\"catalog-v7\""),
  )
  let stored = @cache.stored_response(
    original_request, origin_response, 1000L, 1002L,
  )
  let presented = @cache.request(
    "GET",
    "https://api.example.test/catalog",
    headers=@cache.Headers::empty().add("accept-language", "zh-CN"),
  )
  let fresh = @cache.evaluate_reuse(
    Some(stored),
    presented,
    @cache.SharedCache,
    1060L,
  )
  println("at t=1060: " + verdict_name(fresh.verdict))
  let stale = @cache.evaluate_reuse(
    Some(stored),
    presented,
    @cache.SharedCache,
    1200L,
  )
  println("at t=1200: " + verdict_name(stale.verdict))
  let validation = @cache.prepare_validation(stored, presented)
  println(
    "conditional header: " +
    validation.headers.first("if-none-match").unwrap_or(""),
  )
}

///|
fn verdict_name(verdict : @cache.ReuseVerdict) -> String {
  match verdict {
    @cache.ReuseFresh => "reuse-fresh"
    @cache.Revalidate => "revalidate"
    @cache.ServeStale => "serve-stale"
    @cache.FetchFromOrigin => "fetch-from-origin"
    @cache.OnlyIfCachedMiss => "only-if-cached-miss"
    @cache.NotReusable => "not-reusable"
  }
}