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