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
type word = [`Atom of string | `String of string]
type phrase = [`Dot | `Word of word | `Encoded of Encoded_word.t] list
type t = Rfc5322.group =
{ name : phrase
; mailboxes : Mailbox.t list }
let equal a b =
let mailboxes =
try List.for_all2 Mailbox.equal a.mailboxes b.mailboxes
with _ -> false in
Mailbox.equal_phrase a.name b.name
&& mailboxes
let make ~name mailboxes =
if List.length mailboxes = 0 then None
else Some { name; mailboxes; }
let v ~name mailboxes = match make ~name mailboxes with
| None -> Fmt.invalid_arg "A group contains at least one mailbox"
| Some t -> t
let pp : t Fmt.t = fun ppf t ->
Fmt.pf ppf "{ @[<hov>name = %a;@ \
mailboxes = %a;@] }"
Mailbox.pp_phrase t.name
(Fmt.Dump.list Mailbox.pp) t.mailboxes
module Encoder = struct
open Encoder
let comma = (fun ppf () -> eval ppf [ char $ ','; fws ]), ()
let phrase = Mailbox.Encoder.phrase
let mailbox = Mailbox.Encoder.mailbox
let group ppf t =
eval ppf [ box; !!phrase; char $ ':'; spaces 1; box; !!(list ~sep:comma mailbox); close; char $ ';'; close ]
t.name t.mailboxes
end