Source file mirage_impl_happy_eyeballs.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
open Functoria
open Mirage_impl_time
open Mirage_impl_mclock
open Mirage_impl_stack
open Mirage_impl_dns
type happy_eyeballs = Happy_eyeballs
let happy_eyeballs = Type.v Happy_eyeballs
let generic_happy_eyeballs aaaa_timeout v6_connect_timeout connect_timeout
resolve_timeout resolve_retries timer_interval =
let packages =
[ package "happy-eyeballs-mirage" ~min:"0.3.0" ~max:"1.0.0" ]
in
let keys =
let cons_if_some v l = match v with Some x -> x :: l | None -> l in
cons_if_some aaaa_timeout []
|> cons_if_some v6_connect_timeout
|> cons_if_some resolve_timeout
|> cons_if_some resolve_retries
|> cons_if_some timer_interval
|> List.map Key.v
in
let connect _info modname = function
| [ _time; _mclock; stack; dns ] ->
let pp_optional_argument ~name ppf = function
| None -> ()
| Some key -> Fmt.pf ppf "?%s:%a " name Key.serialize_call (Key.v key)
in
Fmt.str {ocaml|%s.connect_device %a%a%a%a%a%a %s %s|ocaml} modname
(pp_optional_argument ~name:"aaaa_timeout")
aaaa_timeout
(pp_optional_argument ~name:"v6_connect_timeout")
v6_connect_timeout
(pp_optional_argument ~name:"connect_timeout")
connect_timeout
(pp_optional_argument ~name:"resolve_timeout")
resolve_timeout
(pp_optional_argument ~name:"resolve_retries")
resolve_retries
(pp_optional_argument ~name:"timer_interval")
timer_interval dns stack
| _ -> assert false
in
impl ~keys ~packages ~connect "Happy_eyeballs_mirage.Make"
(time @-> mclock @-> stackv4v6 @-> dns_client @-> happy_eyeballs)