(*--------------------------------------------------------------------------- Copyright (c) 2024 Anil Madhavapeddy. All rights reserved. SPDX-License-Identifier: ISC ---------------------------------------------------------------------------*) module Unknown = struct type t = (string * Jsont.json) list let empty = [] let is_empty = function [] -> true | _ -> false end type t = { type_ : string; url : string; unknown : Unknown.t } let create ~type_ ~url ?(unknown = Unknown.empty) () = { type_; url; unknown } let type_ t = t.type_ let url t = t.url let unknown t = t.unknown let equal a b = a.type_ = b.type_ && a.url = b.url let pp ppf t = Format.fprintf ppf "%s: %s" t.type_ t.url let jsont = let kind = "Hub" in let doc = "A hub endpoint" in let unknown_mems : (Unknown.t, Jsont.json, Jsont.mem list) Jsont.Object.Mems.map = let open Jsont.Object.Mems in let dec_empty () = [] in let dec_add _meta (name : string) value acc = ((name, Jsont.Meta.none), value) :: acc in let dec_finish _meta mems = List.rev_map (fun ((name, _meta), value) -> (name, value)) mems in let enc = { enc = (fun (type acc) (f : Jsont.Meta.t -> string -> Jsont.json -> acc -> acc) unknown (acc : acc) -> List.fold_left (fun acc (name, value) -> f Jsont.Meta.none name value acc) acc unknown); } in map ~kind:"Unknown members" Jsont.json ~dec_empty ~dec_add ~dec_finish ~enc in let create_obj type_ url unknown = create ~type_ ~url ~unknown () in Jsont.Object.map ~kind ~doc create_obj |> Jsont.Object.mem "type" Jsont.string ~enc:type_ |> Jsont.Object.mem "url" Jsont.string ~enc:url |> Jsont.Object.keep_unknown unknown_mems ~enc:unknown |> Jsont.Object.finish