Source file consumer_info.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
open! Core

type t =
  { name : Consumer.t
  ; pending : int
  ; idle : Time_ns.Span.t
  ; inactive : Time_ns.Span.t option
  }
[@@deriving sexp_of]

let of_resp3 = function
  | Resp3.(
      Map
        [| (String "name", String name)
         ; (String "pending", Int pending)
         ; (String "idle", Int idle)
         ; (String "inactive", Int inactive)
        |]) ->
    Ok
      { name = Consumer.of_string name
      ; pending
      ; idle = Time_ns.Span.of_int_ms idle
      ; inactive = Time_ns.Span.of_int_ms inactive |> Some
      }
  | Resp3.(
      Map
        [| (String "name", String name)
         ; (String "pending", Int pending)
         ; (String "idle", Int idle)
        |]) ->
    Ok
      { name = Consumer.of_string name
      ; pending
      ; idle = Time_ns.Span.of_int_ms idle
      ; inactive = None
      }
  | resp3 ->
    Or_error.error_s
      [%message [%here] "Unexpected consumer info format" (resp3 : Resp3.t)]
;;

let last_successful_interaction t =
  match t.inactive with
  | Some inactive -> inactive
  | None -> t.idle
;;

let last_attempted_interaction t =
  match t.inactive with
  | Some _ -> Some t.idle
  | None -> None
;;