diff options
author | Louis Pilfold <louis@lpil.uk> | 2022-01-14 22:42:56 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2022-01-14 22:42:56 +0000 |
commit | 476195211e99133c7ef0fedf5a0d8ad3d0de5ede (patch) | |
tree | 570e50eb3d37833c8c49af6e69ee1c8fd6ac7a79 | |
parent | 09e64691040430c4e73f587518db2658ec96a2e7 (diff) | |
download | gleam_stdlib-476195211e99133c7ef0fedf5a0d8ad3d0de5ede.tar.gz gleam_stdlib-476195211e99133c7ef0fedf5a0d8ad3d0de5ede.zip |
Fix field error
-rw-r--r-- | src/gleam/dynamic.gleam | 5 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 9 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 10 | ||||
-rw-r--r-- | test/gleam/dynamic_test.gleam | 18 |
4 files changed, 28 insertions, 14 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam index 05b9acb..938d4c4 100644 --- a/src/gleam/dynamic.gleam +++ b/src/gleam/dynamic.gleam @@ -437,8 +437,9 @@ if javascript { /// pub fn field(named name: a, of inner_type: Decoder(t)) -> Decoder(t) { fn(value) { - try value = decode_field(value, name) - inner_type(value) + value + |> decode_field(name) + |> result.then(inner_type) |> map_errors(push_path(_, name)) } } diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index c757857..e9d6391 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -49,8 +49,10 @@ iodata_append(Iodata, String) -> [Iodata, String]. identity(X) -> X. -decode_error_msg(Expected, Data) -> - {error, [{decode_error, Expected, classify_dynamic(Data), []}]}. +decode_error_msg(Expected, Data) when is_binary(Expected) -> + decode_error(Expected, classify_dynamic(Data)). +decode_error(Expected, Got) when is_binary(Expected) andalso is_binary(Got) -> + {error, [{decode_error, Expected, Got, []}]}. classify_dynamic(X) when is_atom(X) -> <<"Atom">>; classify_dynamic(X) when is_binary(X) -> <<"String">>; @@ -94,7 +96,8 @@ decode_list(Data) -> decode_error_msg(<<"List">>, Data). decode_field(Data, Key) -> case Data of #{Key := Value} -> {ok, Value}; - _ -> decode_error_msg("object", Data) + _ -> + decode_error(<<"field"/utf8>>, <<"nothing"/utf8>>) end. size_of_tuple(Data) -> tuple_size(Data). diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index dd25832..6921348 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -494,10 +494,12 @@ export function classify_dynamic(data) { } function decoder_error(expected, got) { + return decoder_error_no_classify(expected, classify_dynamic(got)); +} + +function decoder_error_no_classify(expected, got) { return new Error( - List.fromArray([ - new DecodeError(expected, classify_dynamic(got), List.fromArray([])), - ]) + List.fromArray([new DecodeError(expected, got, List.fromArray([]))]) ); } @@ -560,7 +562,7 @@ export function decode_option(data, decoder) { } export function decode_field(value, name) { - let error = () => decoder_error("object", value); + let error = () => decoder_error_no_classify("field", "nothing"); if (value instanceof Map) { let entry = value.get(name); return entry.isOk() ? entry : error(); diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam index cba6ff5..6fa2673 100644 --- a/test/gleam/dynamic_test.gleam +++ b/test/gleam/dynamic_test.gleam @@ -260,7 +260,7 @@ if javascript { |> dynamic.from |> dynamic.field("Nope", dynamic.int) |> should.equal(Error([ - DecodeError(expected: "object", found: "Result", path: []), + DecodeError(expected: "field", found: "nothing", path: ["Nope"]), ])) } } @@ -289,22 +289,30 @@ pub fn field_test() { |> map.insert("ok", 3) |> dynamic.from |> dynamic.field("ok", dynamic.string) - |> should.be_error + |> should.equal(Error([ + DecodeError(expected: "String", found: "Int", path: ["ok"]), + ])) map.new() |> dynamic.from |> dynamic.field("ok", dynamic.int) - |> should.be_error + |> should.equal(Error([ + DecodeError(expected: "field", found: "nothing", path: ["ok"]), + ])) 1 |> dynamic.from |> dynamic.field("ok", dynamic.int) - |> should.be_error + |> should.equal(Error([ + DecodeError(expected: "field", found: "nothing", path: ["ok"]), + ])) [] |> dynamic.from |> dynamic.field("ok", dynamic.int) - |> should.be_error + |> should.equal(Error([ + DecodeError(expected: "field", found: "nothing", path: ["ok"]), + ])) } pub fn element_test() { |