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