aboutsummaryrefslogtreecommitdiff
path: root/lib/activitypub/common.ml
diff options
context:
space:
mode:
authorMarc Coquand <marc@mccd.space>2023-12-20 20:43:25 -0600
committerMarc Coquand <marc@mccd.space>2023-12-20 20:43:25 -0600
commitcc783c157f31e7e713c8b83be67449b1859dac27 (patch)
tree52559c115159671839f4b497b9191222faa35520 /lib/activitypub/common.ml
downloadfixgen-cc783c157f31e7e713c8b83be67449b1859dac27.tar.gz
fixgen-cc783c157f31e7e713c8b83be67449b1859dac27.tar.bz2
fixgen-cc783c157f31e7e713c8b83be67449b1859dac27.zip
Initial commit
Diffstat (limited to '')
-rw-r--r--lib/activitypub/common.ml47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/activitypub/common.ml b/lib/activitypub/common.ml
new file mode 100644
index 0000000..59c7099
--- /dev/null
+++ b/lib/activitypub/common.ml
@@ -0,0 +1,47 @@
+module D = Decoders_yojson.Safe.Decode
+
+let timestamp =
+ let open D in
+ let* time = string in
+ match Ptime.of_rfc3339 time |> Ptime.rfc3339_error_to_msg with
+ | Ok (t, _, _) -> succeed t
+ | Error `Msg err -> fail err
+
+let singleton_or_list dec =
+ D.(one_of ["singleton", (dec >|= fun v -> [v]);
+ "list", list dec;
+ "null", null >|= fun () -> []])
+
+let lossy_list_of dec =
+ let open D in
+ list (one_of ["known", (dec >|= fun v -> `Value v); "unknown", value >|= fun v -> `Raw v])
+
+
+let constant ?msg target =
+ let open D in
+ let* str = string in
+ if String.equal str target
+ then succeed ()
+ else match msg with
+ | None -> fail (Printf.sprintf "expected %s received %s" target str)
+ | Some msg -> fail (Printf.sprintf msg str)
+
+let field_or_default field' decoder default =
+ let open D in
+ let+ field = field_opt field' decoder in
+ Option.value ~default field
+
+let list_ignoring_unknown ty =
+ let open D in
+ list (maybe ty) >|= fun v -> List.filter_map Fun.id v
+
+let items obj =
+ let open D in
+ one_of [
+ ("ordered items",
+ let* items = field "orderedItems" (list obj) in
+ succeed (true, items));
+ "items",
+ let* items = field "items" (list obj) in
+ succeed (false, items)
+ ]