///|
fn main raise {
  let limits = @coap.Limits::default()
  let store = @coap.ResourceStore::new(8, 4096, [0, 50], true, limits).unwrap()
  store.put("/telemetry", b"23.5", 0, 2L, false).unwrap() |> ignore
  store.put("/config", b"enabled", 0, 60L, true).unwrap() |> ignore
  let discovery = store.discovery(limits).unwrap()
  let message = @coap.Message::new(
    @coap.Confirmable,
    @coap.Code::request(@coap.Get),
    1,
  )
  message.options = [
    @coap.option_text(11, ".well-known"),
    @coap.option_text(11, "core"),
  ]
  let links = @coap.parse_links(discovery.handle(message).payload, limits).unwrap()
  assert_eq(links.length(), 2)
  println("Discovery: 2 reusable resources")
  let request : @coap.Request = {
    ..@coap.Request::new(@coap.Get),
    options: [@coap.option_text(11, "telemetry")],
  }
  message.options = request.options.copy()
  let cache = @coap.ResponseCache::new(8, 4096, limits).unwrap()
  cache.store("device", request, store.handle(message), 0L).unwrap()
  assert_true(cache.lookup("device", request, 1000L).unwrap() is @coap.Fresh(_))
  let validation = match cache.lookup("device", request, 2000L).unwrap() {
    @coap.Stale(_, request) => request
    _ => abort("stale")
  }
  message.options = validation.options.copy()
  let valid = store.handle(message)
  assert_eq(valid.code.value, 67)
  cache.validate("device", validation, valid, 2000L).unwrap()
  assert_true(cache.lookup("device", request, 2001L).unwrap() is @coap.Fresh(_))
  println("Cache: fresh -> stale -> ETag validated -> fresh")
}