this repo has no description
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6type t = {
7 name : string option;
8 email : string;
9}
10
11let create ?name email = { name; email }
12
13let name t = t.name
14let email t = t.email
15
16let equal a b = a.email = b.email
17
18let pp ppf t =
19 match t.name with
20 | Some name -> Format.fprintf ppf "%s <%s>" name t.email
21 | None -> Format.pp_print_string ppf t.email
22
23let make name email = { name; email }
24
25let jsont =
26 let kind = "EmailAddress" in
27 (* name can be absent, null, or a string - all map to string option *)
28 (* Jsont.option maps null -> None and string -> Some string *)
29 Jsont.Object.map ~kind make
30 |> Jsont.Object.mem "name" Jsont.(option string)
31 ~dec_absent:None ~enc_omit:Option.is_none ~enc:name
32 |> Jsont.Object.mem "email" Jsont.string ~enc:email
33 |> Jsont.Object.finish
34
35module Group = struct
36 type address = t
37
38 type t = {
39 name : string option;
40 addresses : address list;
41 }
42
43 let create ?name addresses = { name; addresses }
44
45 let name t = t.name
46 let addresses t = t.addresses
47
48 let make name addresses = { name; addresses }
49
50 let jsont =
51 let kind = "EmailAddressGroup" in
52 Jsont.Object.map ~kind make
53 |> Jsont.Object.opt_mem "name" Jsont.string ~enc:name
54 |> Jsont.Object.mem "addresses" (Jsont.list jsont) ~enc:addresses
55 |> Jsont.Object.finish
56end