diff options
author | Giacomo Cavalieri <giacomo.cavalieri@icloud.com> | 2023-04-25 19:53:26 +0200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-04-29 14:33:18 +0100 |
commit | 63d17f8a64634badf1855b55fd97cd75ecb03e09 (patch) | |
tree | 5a11aeb397c6cb5d44bec4a36622f52d32a8ade6 | |
parent | 1ad4fbb4fb754950ff08b64efcd1882f8770372f (diff) | |
download | gleam_stdlib-63d17f8a64634badf1855b55fd97cd75ecb03e09.tar.gz gleam_stdlib-63d17f8a64634badf1855b55fd97cd75ecb03e09.zip |
Change `decode_field`'s return type
-rw-r--r-- | src/gleam/dynamic.gleam | 36 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 4 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 7 |
3 files changed, 22 insertions, 25 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam index baeacc4..b500ad6 100644 --- a/src/gleam/dynamic.gleam +++ b/src/gleam/dynamic.gleam @@ -476,13 +476,14 @@ if javascript { /// pub fn field(named name: a, of inner_type: Decoder(t)) -> Decoder(t) { fn(value) { - case decode_field(value, name) { - Error(not_a_map_errors) -> Error(not_a_map_errors) - Ok(dynamic_field_result) -> - dynamic_field_result - |> result.try(inner_type) - |> map_errors(push_path(_, name)) - } + let missing_field_error = + DecodeError(expected: "field", found: "nothing", path: []) + + use maybe_inner <- result.try(decode_field(value, name)) + maybe_inner + |> option.to_result([missing_field_error]) + |> result.try(inner_type) + |> map_errors(push_path(_, name)) } } @@ -520,16 +521,13 @@ pub fn optional_field( of inner_type: Decoder(t), ) -> Decoder(Option(t)) { fn(value) { - case decode_field(value, name) { - Error(not_a_map_errors) -> Error(not_a_map_errors) - Ok(dynamic_field_result) -> - case dynamic_field_result { - Error(_) -> Ok(option.None) - Ok(dynamic_field) -> - dynamic_field - |> decode_optional(inner_type) - |> map_errors(push_path(_, name)) - } + use maybe_inner <- result.try(decode_field(value, name)) + case maybe_inner { + option.None -> Ok(option.None) + option.Some(dynamic_inner) -> + dynamic_inner + |> decode_optional(inner_type) + |> map_errors(push_path(_, name)) } } } @@ -538,7 +536,7 @@ if erlang { external fn decode_field( Dynamic, name, - ) -> Result(Result(Dynamic, DecodeErrors), DecodeErrors) = + ) -> Result(Option(Dynamic), DecodeErrors) = "gleam_stdlib" "decode_field" } @@ -546,7 +544,7 @@ if javascript { external fn decode_field( Dynamic, name, - ) -> Result(Result(Dynamic, DecodeErrors), DecodeErrors) = + ) -> Result(Option(Dynamic), DecodeErrors) = "../gleam_stdlib.mjs" "decode_field" } diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index 4c59893..e8746a2 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -80,9 +80,9 @@ decode_list(Data) -> decode_error_msg(<<"List">>, Data). decode_field(Data, Key) when is_map(Data) -> case Data of - #{Key := Value} -> {ok, {ok, Value}}; + #{Key := Value} -> {ok, {some, Value}}; _ -> - {ok, decode_error(<<"field"/utf8>>, <<"nothing"/utf8>>)} + {ok, none} end; decode_field(Data, _) -> decode_error_msg(<<"Map">>, Data). diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index 52fbc89..a658add 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -663,14 +663,13 @@ export function decode_option(data, decoder) { } export function decode_field(value, name) { - let missing_field_error = () => decoder_error_no_classify("field", "nothing"); let not_a_map_error = () => decoder_error("Map", value); if (value instanceof PMap || value instanceof WeakMap || value instanceof Map) { let entry = map_get(value, name); - return new Ok(entry.isOk() ? entry : missing_field_error()); + return new Ok(entry.isOk() ? new Some(entry[0]) : new None()); } else if (Object.getPrototypeOf(value) == Object.prototype) { - return try_get_field(value, name, () => new Ok(missing_field_error())); + return try_get_field(value, name, () => new Ok(new None())); } else { return try_get_field(value, name, not_a_map_error); } @@ -678,7 +677,7 @@ export function decode_field(value, name) { function try_get_field(value, field, or_else) { try { - return field in value ? new Ok(new Ok(value[field])) : or_else(); + return field in value ? new Ok(new Some(value[field])) : or_else(); } catch { return or_else(); } |