readme
[Seppo.git] / as2_vocab / common.ml
blob06551ad6087aeba3e62c61af9cd2521b6cc790db
1 module D = Decoders_ezjsonm.Decode
3 let rfc3339 =
4 let open D in
5 let* time = string in
6 match time |> Ptime.of_rfc3339 |> Ptime.rfc3339_error_to_msg with
7 | Ok (t, _, _) -> succeed t
8 | Error `Msg err -> fail err
10 let singleton_or_list dec =
11 D.(one_of ["singleton", (dec >|= fun v -> [v]);
12 "list", list dec;
13 "null", null >|= fun () -> []])
15 let lossy_list_of dec =
16 let open D in
17 list (one_of ["known", (dec >|= fun v -> `Value v)(*; "unknown", value >|= fun v -> `Raw v*)])
20 let constant ?msg target =
21 let open D in
22 let* str = string in
23 if String.equal str target
24 then succeed ()
25 else match msg with
26 | None -> fail (Printf.sprintf "expected %s received %s" target str)
27 | Some msg -> fail (Printf.sprintf msg str)
29 let field_or_default field' decoder default =
30 let open D in
31 let+ field = field_opt field' decoder in
32 Option.value ~default field
34 let list_ignoring_unknown ty =
35 let open D in
36 list (maybe ty) >|= fun v -> List.filter_map Fun.id v
38 let items obj =
39 let open D in
40 one_of [
41 ("ordered items",
42 let* items = field "orderedItems" (list obj) in
43 succeed (true, items));
44 "items",
45 let* items = field "items" (list obj) in
46 succeed (false, items)
49 let items_opt obj =
50 let open D in
51 maybe (items obj)