this repo has no description
at main 1.5 kB view raw
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