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 url : string;
15 doi : string option;
16 cito : Cito.t list option;
17 unknown : Unknown.t;
18}
19
20let create ~url ?doi ?cito ?(unknown = Unknown.empty) () =
21 { url; doi; cito; unknown }
22
23let url t = t.url
24let doi t = t.doi
25let cito t = t.cito
26let unknown t = t.unknown
27let equal a b = String.equal a.url b.url
28
29let pp ppf t =
30 let open Format in
31 fprintf ppf "%s" t.url;
32 Option.iter (fprintf ppf " [DOI: %s]") t.doi
33
34let jsont =
35 let kind = "Reference" in
36 let doc = "A reference to a cited source" in
37 let create_obj url doi cito unknown = create ~url ?doi ?cito ~unknown () in
38 Jsont.Object.map ~kind ~doc create_obj
39 |> Jsont.Object.mem "url" Jsont.string ~enc:url
40 |> Jsont.Object.opt_mem "doi" Jsont.string ~enc:doi
41 |> Jsont.Object.opt_mem "cito" (Jsont.list Cito.jsont) ~enc:cito
42 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
43 |> Jsont.Object.finish