forked from
anil.recoil.org/ocaml-jmap
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.Object.map ~kind make
29 |> Jsont.Object.mem "name" Jsont.(option string)
30 ~dec_absent:None ~enc_omit:Option.is_none ~enc:name
31 |> Jsont.Object.mem "email" Jsont.string ~enc:email
32 |> Jsont.Object.finish
33
34module Group = struct
35 type address = t
36
37 type t = {
38 name : string option;
39 addresses : address list;
40 }
41
42 let create ?name addresses = { name; addresses }
43
44 let name t = t.name
45 let addresses t = t.addresses
46
47 let make name addresses = { name; addresses }
48
49 let jsont =
50 let kind = "EmailAddressGroup" in
51 (* name can be null per RFC 8621 Section 4.1.2.3 *)
52 Jsont.Object.map ~kind make
53 |> Jsont.Object.mem "name" Jsont.(option string)
54 ~dec_absent:None ~enc_omit:Option.is_none ~enc:name
55 |> Jsont.Object.mem "addresses" (Jsont.list jsont) ~enc:addresses
56 |> Jsont.Object.finish
57end