aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2022-01-01 23:33:58 +0000
committerLouis Pilfold <louis@lpil.uk>2022-01-01 23:33:58 +0000
commit98277883177ae6531bc68bb799d103e516c2006b (patch)
tree5b2e3b1a1b7f54c3af77e995bac17f4b697e546c
parent9d40cdf444e0c73c192561658855f259cab6b507 (diff)
downloadgleam_stdlib-98277883177ae6531bc68bb799d103e516c2006b.tar.gz
gleam_stdlib-98277883177ae6531bc68bb799d103e516c2006b.zip
Set path in element and field functions
-rw-r--r--src/gleam/dynamic.gleam2
-rw-r--r--src/gleam_stdlib.erl2
-rw-r--r--src/gleam_stdlib.mjs2
-rw-r--r--test/gleam/dynamic_test.gleam8
4 files changed, 10 insertions, 4 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam
index 9a626dc..04a01ae 100644
--- a/src/gleam/dynamic.gleam
+++ b/src/gleam/dynamic.gleam
@@ -404,6 +404,7 @@ pub fn field(
) -> Result(t, DecodeErrors) {
try value = decode_field(value, name)
inner_type(value)
+ |> map_errors(push_path(_, name))
}
if erlang {
@@ -450,6 +451,7 @@ pub fn element(
}
}
inner_type(data)
+ |> map_errors(push_path(_, index))
}
fn exact_decode_tuple_error(size: Int, data: Dynamic) -> Result(a, DecodeErrors) {
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index d88b964..3228b18 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -94,7 +94,7 @@ decode_list(Data) -> decode_error_msg(<<"List">>, Data).
decode_field(Data, Key) ->
case Data of
#{Key := Value} -> {ok, Value};
- _ -> decode_error_msg(io_lib:format("Value with field `~p`", [Key]), Data)
+ _ -> decode_error_msg("object", Data)
end.
size_of_tuple(Data) -> tuple_size(Data).
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index 4d8f65e..8340cd6 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -558,7 +558,7 @@ export function decode_option(data, decoder) {
}
export function decode_field(value, name) {
- let error = () => decoder_error(`Value with field ${inspect(name)}`, value);
+ let error = () => decoder_error("object", value);
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 7d490dc..902cc92 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -254,7 +254,11 @@ if javascript {
|> dynamic.from
|> dynamic.field("Nope", dynamic.int)
|> should.equal(Error([
- DecodeError(expected: "Value with field \"Nope\"", found: "Result"),
+ DecodeError(
+ expected: "Value with field \"Nope\"",
+ found: "Result",
+ path: [],
+ ),
]))
}
}
@@ -318,7 +322,7 @@ pub fn element_test() {
|> dynamic.from
|> dynamic.element(1, dynamic.string)
|> should.equal(Error([
- DecodeError(expected: "String", found: "Int", path: []),
+ DecodeError(expected: "String", found: "Int", path: ["1"]),
]))
ok_one_tuple