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