diff --git a/src/at/internal/decoding.gleam b/src/at/internal/decoding.gleam index dd9d5ea..5b2c10b 100644 --- a/src/at/internal/decoding.gleam +++ b/src/at/internal/decoding.gleam @@ -2,6 +2,8 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option, None, Some} +import gleam/set.{type Set} +import gleam/uri.{type Uri} /// /// @@ -12,3 +14,20 @@ pub fn optional_field( ) -> Decoder(b) { decode.optional_field(name, None, decode.map(decoder, Some), next) } + +/// +/// +pub fn uri() -> Decoder(Uri) { + decode.then(decode.string, fn(value) { + case uri.parse(value) { + Ok(uri) -> decode.success(uri) + Error(_) -> decode.failure(uri.empty, "uri.Uri") + } + }) +} + +/// +/// +pub fn set(inner: Decoder(a)) -> Decoder(Set(a)) { + decode.map(decode.list(inner), set.from_list) +}