(*--------------------------------------------------------------------------- Copyright (c) 2025 Anil Madhavapeddy. All rights reserved. SPDX-License-Identifier: ISC ---------------------------------------------------------------------------*) type t = { name : string option; email : string; } let create ?name email = { name; email } let name t = t.name let email t = t.email let equal a b = a.email = b.email let pp ppf t = match t.name with | Some name -> Format.fprintf ppf "%s <%s>" name t.email | None -> Format.pp_print_string ppf t.email let make name email = { name; email } let jsont = let kind = "EmailAddress" in (* name can be absent, null, or a string - all map to string option *) Jsont.Object.map ~kind make |> Jsont.Object.mem "name" Jsont.(option string) ~dec_absent:None ~enc_omit:Option.is_none ~enc:name |> Jsont.Object.mem "email" Jsont.string ~enc:email |> Jsont.Object.finish module Group = struct type address = t type t = { name : string option; addresses : address list; } let create ?name addresses = { name; addresses } let name t = t.name let addresses t = t.addresses let make name addresses = { name; addresses } let jsont = let kind = "EmailAddressGroup" in (* name can be null per RFC 8621 Section 4.1.2.3 *) Jsont.Object.map ~kind make |> Jsont.Object.mem "name" Jsont.(option string) ~dec_absent:None ~enc_omit:Option.is_none ~enc:name |> Jsont.Object.mem "addresses" (Jsont.list jsont) ~enc:addresses |> Jsont.Object.finish end