(** Cache entry information *) type t = { key : string; size : int64; mtime : float; ttl : float option; flags : Flags.t; } let create ~key ~size ~mtime ~ttl ~flags = { key; size; mtime; ttl; flags } let key t = t.key let size t = t.size let mtime t = t.mtime let ttl t = t.ttl let flags t = t.flags let is_expired t = match t.ttl with | None -> false | Some expiry -> Unix.time () > expiry let is_pinned t = Flags.is_pinned t.flags let is_stale t = Flags.is_stale t.flags let is_temporary t = Flags.is_temporary t.flags let compare_by_mtime a b = Float.compare a.mtime b.mtime let compare_by_size a b = Int64.compare a.size b.size let pp fmt t = Format.fprintf fmt "Entry{key=%s, size=%Ld, mtime=%.1f, ttl=%s, flags=%a}" t.key t.size t.mtime (match t.ttl with | None -> "never" | Some exp -> Printf.sprintf "%.1f" exp) Flags.pp t.flags (* Jsont support *) (* Helper codec for int64 *) let int64_jsont = let kind = "Int64" in let doc = "64-bit integer as number" in let dec n = Int64.of_float n in let enc i = Int64.to_float i in Jsont.map ~kind ~doc ~dec ~enc Jsont.number let jsont = let kind = "Entry" in let doc = "A cache entry" in let make key size mtime ttl flags = { key; size; mtime; ttl; flags } in Jsont.Object.map ~kind ~doc make |> Jsont.Object.mem "key" Jsont.string ~enc:key |> Jsont.Object.mem "size" int64_jsont ~enc:size |> Jsont.Object.mem "mtime" Jsont.number ~enc:mtime |> Jsont.Object.opt_mem "ttl" Jsont.number ~enc:ttl |> Jsont.Object.mem "flags" Flags.jsont ~enc:flags |> Jsont.Object.finish