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