Skip to content

Commit 63d17f8

Browse files
giacomocavalierilpil
authored andcommitted
Change decode_field's return type
1 parent 1ad4fbb commit 63d17f8

File tree

3 files changed

+22
-25
lines changed

3 files changed

+22
-25
lines changed

src/gleam/dynamic.gleam

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,14 @@ if javascript {
476476
///
477477
pub fn field(named name: a, of inner_type: Decoder(t)) -> Decoder(t) {
478478
fn(value) {
479-
case decode_field(value, name) {
480-
Error(not_a_map_errors) -> Error(not_a_map_errors)
481-
Ok(dynamic_field_result) ->
482-
dynamic_field_result
483-
|> result.try(inner_type)
484-
|> map_errors(push_path(_, name))
485-
}
479+
let missing_field_error =
480+
DecodeError(expected: "field", found: "nothing", path: [])
481+
482+
use maybe_inner <- result.try(decode_field(value, name))
483+
maybe_inner
484+
|> option.to_result([missing_field_error])
485+
|> result.try(inner_type)
486+
|> map_errors(push_path(_, name))
486487
}
487488
}
488489

@@ -520,16 +521,13 @@ pub fn optional_field(
520521
of inner_type: Decoder(t),
521522
) -> Decoder(Option(t)) {
522523
fn(value) {
523-
case decode_field(value, name) {
524-
Error(not_a_map_errors) -> Error(not_a_map_errors)
525-
Ok(dynamic_field_result) ->
526-
case dynamic_field_result {
527-
Error(_) -> Ok(option.None)
528-
Ok(dynamic_field) ->
529-
dynamic_field
530-
|> decode_optional(inner_type)
531-
|> map_errors(push_path(_, name))
532-
}
524+
use maybe_inner <- result.try(decode_field(value, name))
525+
case maybe_inner {
526+
option.None -> Ok(option.None)
527+
option.Some(dynamic_inner) ->
528+
dynamic_inner
529+
|> decode_optional(inner_type)
530+
|> map_errors(push_path(_, name))
533531
}
534532
}
535533
}
@@ -538,15 +536,15 @@ if erlang {
538536
external fn decode_field(
539537
Dynamic,
540538
name,
541-
) -> Result(Result(Dynamic, DecodeErrors), DecodeErrors) =
539+
) -> Result(Option(Dynamic), DecodeErrors) =
542540
"gleam_stdlib" "decode_field"
543541
}
544542

545543
if javascript {
546544
external fn decode_field(
547545
Dynamic,
548546
name,
549-
) -> Result(Result(Dynamic, DecodeErrors), DecodeErrors) =
547+
) -> Result(Option(Dynamic), DecodeErrors) =
550548
"../gleam_stdlib.mjs" "decode_field"
551549
}
552550

src/gleam_stdlib.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ decode_list(Data) -> decode_error_msg(<<"List">>, Data).
8080

8181
decode_field(Data, Key) when is_map(Data) ->
8282
case Data of
83-
#{Key := Value} -> {ok, {ok, Value}};
83+
#{Key := Value} -> {ok, {some, Value}};
8484
_ ->
85-
{ok, decode_error(<<"field"/utf8>>, <<"nothing"/utf8>>)}
85+
{ok, none}
8686
end;
8787
decode_field(Data, _) ->
8888
decode_error_msg(<<"Map">>, Data).

src/gleam_stdlib.mjs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -663,22 +663,21 @@ export function decode_option(data, decoder) {
663663
}
664664

665665
export function decode_field(value, name) {
666-
let missing_field_error = () => decoder_error_no_classify("field", "nothing");
667666
let not_a_map_error = () => decoder_error("Map", value);
668667

669668
if (value instanceof PMap || value instanceof WeakMap || value instanceof Map) {
670669
let entry = map_get(value, name);
671-
return new Ok(entry.isOk() ? entry : missing_field_error());
670+
return new Ok(entry.isOk() ? new Some(entry[0]) : new None());
672671
} else if (Object.getPrototypeOf(value) == Object.prototype) {
673-
return try_get_field(value, name, () => new Ok(missing_field_error()));
672+
return try_get_field(value, name, () => new Ok(new None()));
674673
} else {
675674
return try_get_field(value, name, not_a_map_error);
676675
}
677676
}
678677

679678
function try_get_field(value, field, or_else) {
680679
try {
681-
return field in value ? new Ok(new Ok(value[field])) : or_else();
680+
return field in value ? new Ok(new Some(value[field])) : or_else();
682681
} catch {
683682
return or_else();
684683
}

0 commit comments

Comments
 (0)