aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2022-01-14 22:42:56 +0000
committerLouis Pilfold <louis@lpil.uk>2022-01-14 22:42:56 +0000
commit476195211e99133c7ef0fedf5a0d8ad3d0de5ede (patch)
tree570e50eb3d37833c8c49af6e69ee1c8fd6ac7a79
parent09e64691040430c4e73f587518db2658ec96a2e7 (diff)
downloadgleam_stdlib-476195211e99133c7ef0fedf5a0d8ad3d0de5ede.tar.gz
gleam_stdlib-476195211e99133c7ef0fedf5a0d8ad3d0de5ede.zip
Fix field error
-rw-r--r--src/gleam/dynamic.gleam5
-rw-r--r--src/gleam_stdlib.erl9
-rw-r--r--src/gleam_stdlib.mjs10
-rw-r--r--test/gleam/dynamic_test.gleam18
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() {