OCaml library for JSONfeed parsing and creation

simplfiy unknown handling from the jsont cookbook

+4 -29
lib/attachment.ml
···
---------------------------------------------------------------------------*)
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type t = {
···
let jsont =
let kind = "Attachment" in
let doc = "An attachment object" 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 url mime_type title size_in_bytes duration_in_seconds unknown =
create ~url ~mime_type ?title ?size_in_bytes ?duration_in_seconds ~unknown
()
···
|> Jsont.Object.opt_mem "size_in_bytes" Jsont.int64 ~enc:size_in_bytes
|> Jsont.Object.opt_mem "duration_in_seconds" Jsont.int
~enc:duration_in_seconds
-
|> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
|> Jsont.Object.finish
+3 -3
lib/attachment.mli
···
(** {1 Unknown Fields} *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown/unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown/unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)
+4 -30
lib/author.ml
···
---------------------------------------------------------------------------*)
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type t = {
···
let jsont =
let kind = "Author" in
let doc = "An author object with at least one field set" in
-
(* Custom mems map for Unknown.t that strips metadata from names *)
-
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
(* Constructor that matches the jsont object map pattern *)
let create_obj name url avatar unknown =
create ?name ?url ?avatar ~unknown ()
···
|> Jsont.Object.opt_mem "name" Jsont.string ~enc:name
|> Jsont.Object.opt_mem "url" Jsont.string ~enc:url
|> Jsont.Object.opt_mem "avatar" Jsont.string ~enc:avatar
-
|> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
|> Jsont.Object.finish
+3 -3
lib/author.mli
···
(** {1 Unknown Fields} *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown/unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown/unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)
+4 -29
lib/hub.ml
···
---------------------------------------------------------------------------*)
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type t = { type_ : string; url : string; unknown : Unknown.t }
···
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.keep_unknown Jsont.json_mems ~enc:unknown
|> Jsont.Object.finish
+3 -3
lib/hub.mli
···
(** {1 Unknown Fields} *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown/unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown/unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)
+4 -30
lib/item.ml
···
---------------------------------------------------------------------------*)
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type content = [ `Html of string | `Text of string | `Both of string * string ]
···
let enc_references t = t.references in
let enc_unknown t = t.unknown 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
-
Jsont.Object.map ~kind ~doc make_from_json
|> Jsont.Object.mem "id" Jsont.string ~enc:enc_id
|> Jsont.Object.opt_mem "content_html" Jsont.string ~enc:enc_content_html
···
(Jsont.list Reference.jsont)
~enc:enc_references
|> Jsont.Object.opt_mem "_extensions" Jsont.json_object ~enc:(fun _t -> None)
-
|> Jsont.Object.keep_unknown unknown_mems ~enc:enc_unknown
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:enc_unknown
|> Jsont.Object.finish
+3 -3
lib/item.mli
···
(** {1 Unknown Fields} *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown/unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown/unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)
+4 -29
lib/jsonfeed.ml
···
module Item = Item
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type t = {
···
let jsont =
let kind = "JSON Feed" in
let doc = "A JSON Feed document" 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
(* Helper constructor that sets version automatically *)
let make_from_json _version title home_page_url feed_url description
···
|> Jsont.Object.opt_mem "expired" Jsont.bool ~enc:expired
|> Jsont.Object.opt_mem "hubs" (Jsont.list Hub.jsont) ~enc:hubs
|> Jsont.Object.mem "items" (Jsont.list Item.jsont) ~enc:items
-
|> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
|> Jsont.Object.finish
(* Encoding and Decoding *)
+3 -3
lib/jsonfeed.mli
···
optional fields. *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown or unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown or unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)
+4 -29
lib/reference.ml
···
---------------------------------------------------------------------------*)
module Unknown = struct
-
type t = (string * Jsont.json) list
+
type t = Jsont.json
-
let empty = []
-
let is_empty = function [] -> true | _ -> false
+
let empty = Jsont.Object ([], Jsont.Meta.none)
+
let is_empty = function Jsont.Object ([], _) -> true | _ -> false
end
type t = {
···
let jsont =
let kind = "Reference" in
let doc = "A reference to a cited source" 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 url doi cito unknown = create ~url ?doi ?cito ~unknown () in
Jsont.Object.map ~kind ~doc create_obj
|> Jsont.Object.mem "url" Jsont.string ~enc:url
|> Jsont.Object.opt_mem "doi" Jsont.string ~enc:doi
|> Jsont.Object.opt_mem "cito" (Jsont.list Cito.jsont) ~enc:cito
-
|> Jsont.Object.keep_unknown unknown_mems ~enc:unknown
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
|> Jsont.Object.finish
+3 -3
lib/reference.mli
···
(** {1 Unknown Fields} *)
module Unknown : sig
-
type t = (string * Jsont.json) list
-
(** Unknown/unrecognized JSON object members. Useful for preserving fields
-
from custom extensions or future spec versions. *)
+
type t = Jsont.json
+
(** Unknown/unrecognized JSON object members as a generic JSON object.
+
Useful for preserving fields from custom extensions or future spec versions. *)
val empty : t
(** [empty] is the empty list of unknown fields. *)