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] }), + ) +}