2025-10-03 18:14:17 +02:00
|
|
|
open Types
|
|
|
|
|
|
|
|
|
|
let encode_exn jsont v = Jsont_bytesrw.encode_string jsont v |> Result.get_ok
|
|
|
|
|
let encode jsont v = Jsont_bytesrw.encode_string jsont v
|
|
|
|
|
let decode jsont v = Jsont_bytesrw.decode_string jsont v
|
|
|
|
|
|
2025-10-03 18:44:35 +02:00
|
|
|
(* JavaScript numbers restricted to integers. *)
|
|
|
|
|
|
2025-10-03 18:14:17 +02:00
|
|
|
module Error_detail = struct
|
|
|
|
|
open Error_detail
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make code hint = { code; hint } in
|
|
|
|
|
let enc_code v = v.code in
|
|
|
|
|
let enc_hint v = v.hint in
|
|
|
|
|
Jsont.Object.map ~kind:"ErrorDetail" make
|
|
|
|
|
|> Jsont.Object.mem "code" Jsont.int ~enc:enc_code
|
|
|
|
|
|> Jsont.Object.opt_mem "hint" Jsont.(string) ~enc:enc_hint
|
|
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
module Timestamp = struct
|
|
|
|
|
open Timestamp
|
|
|
|
|
|
|
|
|
|
let number_or_never_jsont =
|
|
|
|
|
let never =
|
|
|
|
|
let dec s =
|
|
|
|
|
match s with
|
|
|
|
|
| "never" -> Never
|
|
|
|
|
| _ -> Jsont.Error.msg Jsont.Meta.none "unexpected string value"
|
|
|
|
|
in
|
|
|
|
|
let enc = function Never -> "never" | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.string
|
|
|
|
|
in
|
|
|
|
|
let number =
|
|
|
|
|
let dec n = Seconds n in
|
|
|
|
|
let enc = function Seconds n -> n | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.number
|
|
|
|
|
in
|
|
|
|
|
let enc = function Never -> never | Seconds _ -> number in
|
|
|
|
|
Jsont.any ~dec_string:never ~dec_number:number ~enc ()
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make t_s = t_s in
|
|
|
|
|
Jsont.Object.map ~kind:"Timestamp" make
|
|
|
|
|
|> Jsont.Object.mem "t_s" number_or_never_jsont ~enc:Fun.id
|
|
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
2025-10-03 18:44:35 +02:00
|
|
|
|
|
|
|
|
module Relative_time = struct
|
|
|
|
|
open Relative_time
|
|
|
|
|
|
|
|
|
|
let number_or_forever_jsont =
|
|
|
|
|
let forever =
|
|
|
|
|
let dec s =
|
|
|
|
|
match s with
|
|
|
|
|
| "forever" -> Forever
|
|
|
|
|
| _ -> Jsont.Error.msg Jsont.Meta.none "unexpected string value"
|
|
|
|
|
in
|
|
|
|
|
let enc = function Forever -> "forever" | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.string
|
|
|
|
|
in
|
|
|
|
|
let number =
|
|
|
|
|
let dec n = Microseconds n in
|
|
|
|
|
let enc = function Microseconds n -> n | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.number
|
|
|
|
|
in
|
|
|
|
|
let enc = function Forever -> forever | Microseconds _ -> number in
|
|
|
|
|
Jsont.any ~dec_string:forever ~dec_number:number ~enc ()
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make t_s = t_s in
|
|
|
|
|
Jsont.Object.map ~kind:"RelativeTime" make
|
|
|
|
|
|> Jsont.Object.mem "t_s" number_or_forever_jsont ~enc:Fun.id
|
|
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|