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 = { type_ : string; url : string; unknown : Unknown.t }
14
15let create ~type_ ~url ?(unknown = Unknown.empty) () = { type_; url; unknown }
16let type_ t = t.type_
17let url t = t.url
18let unknown t = t.unknown
19let equal a b = a.type_ = b.type_ && a.url = b.url
20let pp ppf t = Format.fprintf ppf "%s: %s" t.type_ t.url
21
22let jsont =
23 let kind = "Hub" in
24 let doc = "A hub endpoint" in
25 let unknown_mems :
26 (Unknown.t, Jsont.json, Jsont.mem list) Jsont.Object.Mems.map =
27 let open Jsont.Object.Mems in
28 let dec_empty () = [] in
29 let dec_add _meta (name : string) value acc =
30 ((name, Jsont.Meta.none), value) :: acc
31 in
32 let dec_finish _meta mems =
33 List.rev_map (fun ((name, _meta), value) -> (name, value)) mems
34 in
35 let enc =
36 {
37 enc =
38 (fun (type acc)
39 (f : Jsont.Meta.t -> string -> Jsont.json -> acc -> acc)
40 unknown
41 (acc : acc)
42 ->
43 List.fold_left
44 (fun acc (name, value) -> f Jsont.Meta.none name value acc)
45 acc unknown);
46 }
47 in
48 map ~kind:"Unknown members" Jsont.json ~dec_empty ~dec_add ~dec_finish ~enc
49 in
50 let create_obj type_ url unknown = create ~type_ ~url ~unknown () in
51 Jsont.Object.map ~kind ~doc create_obj
52 |> Jsont.Object.mem "type" Jsont.string ~enc:type_
53 |> Jsont.Object.mem "url" Jsont.string ~enc:url
54 |> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
55 |> Jsont.Object.finish