OCaml library for JSONfeed parsing and creation
1(*---------------------------------------------------------------------------
2 Copyright (c) 2024 Anil Madhavapeddy. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6module Unknown = struct
7 type t = Jsont.json
8
9 let empty = Jsont.Object ([], Jsont.Meta.none)
10 let is_empty = function Jsont.Object ([], _) -> true | _ -> false
11end
12
13type t = {
14 name : string option;
15 url : string option;
16 avatar : string option;
17 unknown : Unknown.t;
18}
19
20let create ?name ?url ?avatar ?(unknown = Unknown.empty) () =
21 if name = None && url = None && avatar = None then
22 invalid_arg
23 "Author.create: at least one field (name, url, or avatar) must be \
24 provided";
25 { name; url; avatar; unknown }
26
27let name t = t.name
28let url t = t.url
29let avatar t = t.avatar
30let unknown t = t.unknown
31let is_valid t = t.name <> None || t.url <> None || t.avatar <> None
32let equal a b = a.name = b.name && a.url = b.url && a.avatar = b.avatar
33
34let pp ppf t =
35 match (t.name, t.url) with
36 | Some name, Some url -> Format.fprintf ppf "%s <%s>" name url
37 | Some name, None -> Format.fprintf ppf "%s" name
38 | None, Some url -> Format.fprintf ppf "<%s>" url
39 | None, None -> (
40 match t.avatar with
41 | Some avatar -> Format.fprintf ppf "(avatar: %s)" avatar
42 | None -> Format.fprintf ppf "(empty author)")
43
44let jsont =
45 let kind = "Author" in
46 let doc = "An author object with at least one field set" in
47 (* Constructor that matches the jsont object map pattern *)
48 let create_obj name url avatar unknown =
49 create ?name ?url ?avatar ~unknown ()
50 in
51 Jsont.Object.map ~kind ~doc create_obj
52 |> Jsont.Object.opt_mem "name" Jsont.string ~enc:name
53 |> Jsont.Object.opt_mem "url" Jsont.string ~enc:url
54 |> Jsont.Object.opt_mem "avatar" Jsont.string ~enc:avatar
55 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
56 |> Jsont.Object.finish