OCaml library for JSONfeed parsing and creation
at v1.1.0 1.9 kB view raw
1(*--------------------------------------------------------------------------- 2 Copyright (c) 2024 Anil Madhavapeddy. All rights reserved. 3 SPDX-License-Identifier: ISC 4 ---------------------------------------------------------------------------*) 5 6module Unknown = struct 7 type t = Jsont.json 8 9 let empty = Jsont.Object ([], Jsont.Meta.none) 10 let is_empty = function Jsont.Object ([], _) -> true | _ -> false 11end 12 13type t = { 14 name : string option; 15 url : string option; 16 avatar : string option; 17 unknown : Unknown.t; 18} 19 20let create ?name ?url ?avatar ?(unknown = Unknown.empty) () = 21 if name = None && url = None && avatar = None then 22 invalid_arg 23 "Author.create: at least one field (name, url, or avatar) must be \ 24 provided"; 25 { name; url; avatar; unknown } 26 27let name t = t.name 28let url t = t.url 29let avatar t = t.avatar 30let unknown t = t.unknown 31let is_valid t = t.name <> None || t.url <> None || t.avatar <> None 32let equal a b = a.name = b.name && a.url = b.url && a.avatar = b.avatar 33 34let pp ppf t = 35 match (t.name, t.url) with 36 | Some name, Some url -> Format.fprintf ppf "%s <%s>" name url 37 | Some name, None -> Format.fprintf ppf "%s" name 38 | None, Some url -> Format.fprintf ppf "<%s>" url 39 | None, None -> ( 40 match t.avatar with 41 | Some avatar -> Format.fprintf ppf "(avatar: %s)" avatar 42 | None -> Format.fprintf ppf "(empty author)") 43 44let jsont = 45 let kind = "Author" in 46 let doc = "An author object with at least one field set" in 47 (* Constructor that matches the jsont object map pattern *) 48 let create_obj name url avatar unknown = 49 create ?name ?url ?avatar ~unknown () 50 in 51 Jsont.Object.map ~kind ~doc create_obj 52 |> Jsont.Object.opt_mem "name" Jsont.string ~enc:name 53 |> Jsont.Object.opt_mem "url" Jsont.string ~enc:url 54 |> Jsont.Object.opt_mem "avatar" Jsont.string ~enc:avatar 55 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown 56 |> Jsont.Object.finish