From f5462e73dd1cf9ba055e1b6f2ee68bb44628c3ec Mon Sep 17 00:00:00 2001 From: Hayleigh Thompson Date: Fri, 7 Aug 2026 17:58:44 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20json=20encoding=20for=20did?= =?UTF-8?q?=20documents.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/at/internal/encoding.gleam | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/at/internal/encoding.gleam diff --git a/src/at/internal/encoding.gleam b/src/at/internal/encoding.gleam new file mode 100644 index 0000000..7bc7f64 --- /dev/null +++ b/src/at/internal/encoding.gleam @@ -0,0 +1,36 @@ +import gleam/json.{type Json} +import gleam/list +import gleam/option.{type Option, None, Some} +import gleam/set +import gleam/uri + +pub fn optional_object( + required: List(#(String, Json)), + optional: List(Option(#(String, Json))), +) -> Json { + optional + |> list.filter_map(option.to_result(_, Error(Nil))) + |> list.append(required) + |> json.object +} + +pub fn optional_field( + name: String, + value: Option(a), + inner: fn(a) -> Json, +) -> Option(#(String, Json)) { + case value { + Some(v) -> Some(#(name, inner(v))) + None -> None + } +} + +pub fn uri(value: uri.Uri) -> Json { + json.string(uri.to_string(value)) +} + +pub fn set(value: set.Set(a), inner: fn(a) -> Json) -> Json { + json.preprocessed_array( + set.fold(value, [], fn(values, v) { [inner(v), ..values] }), + ) +} -- 2.51.2