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 = (string * Jsont.json) list
8
9 let empty = []
10 let is_empty = function [] -> 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 make ~url ?doi ?cito ?(unknown = Unknown.empty) () =
21 { url; doi; cito; unknown }
22
23let create ~url ?doi ?cito () =
24 make ~url ?doi ?cito ()
25
26let url t = t.url
27let doi t = t.doi
28let cito t = t.cito
29let unknown t = t.unknown
30
31let equal a b = String.equal a.url b.url
32
33let pp ppf t =
34 let open Format in
35 fprintf ppf "%s" t.url;
36 match t.doi with
37 | Some d -> fprintf ppf " [DOI: %s]" d
38 | None -> ()
39
40let jsont =
41 let kind = "Reference" in
42 let doc = "A reference to a cited source" in
43 let unknown_mems : (Unknown.t, Jsont.json, Jsont.mem list) Jsont.Object.Mems.map =
44 let open Jsont.Object.Mems in
45 let dec_empty () = [] in
46 let dec_add _meta (name : string) value acc =
47 ((name, Jsont.Meta.none), value) :: acc
48 in
49 let dec_finish _meta mems =
50 List.rev_map (fun ((name, _meta), value) -> (name, value)) mems in
51 let enc = {
52 enc = fun (type acc) (f : Jsont.Meta.t -> string -> Jsont.json -> acc -> acc) unknown (acc : acc) ->
53 List.fold_left (fun acc (name, value) ->
54
55 f Jsont.Meta.none name value acc
56 ) acc unknown
57 } in
58 map ~kind:"Unknown members" Jsont.json ~dec_empty ~dec_add ~dec_finish ~enc
59 in
60 let make_obj url doi cito unknown = make ~url ?doi ?cito ~unknown () in
61 Jsont.Object.map ~kind ~doc make_obj
62 |> Jsont.Object.mem "url" Jsont.string ~enc:url
63 |> Jsont.Object.opt_mem "doi" Jsont.string ~enc:doi
64 |> Jsont.Object.opt_mem "cito" (Jsont.list Cito.jsont) ~enc:cito
65 |> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
66 |> Jsont.Object.finish