aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-09-09 22:09:06 +0100
committerLouis Pilfold <louis@lpil.uk>2021-09-09 22:09:06 +0100
commita595d4be50fe7e4e5a946bf5ed5878fa7bd42b64 (patch)
tree68c0077a2f7d6f9302768bfc7aea53feafc15eca
parent16da5a271ae7a7decbf8424d9b2acad01343622e (diff)
downloadgleam_stdlib-a595d4be50fe7e4e5a946bf5ed5878fa7bd42b64.tar.gz
gleam_stdlib-a595d4be50fe7e4e5a946bf5ed5878fa7bd42b64.zip
Improve error messages
-rw-r--r--src/gleam_stdlib.erl38
-rw-r--r--src/gleam_stdlib.js19
-rw-r--r--test/gleam/dynamic_test.gleam8
3 files changed, 40 insertions, 25 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 98b4a4b..c52e694 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -108,35 +108,39 @@ 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("a map with key `~p`", [Key]), Data)
+ #{Key := Value} -> {ok, Value};
+ _ -> decode_error_msg(io_lib:format("a map with key `~p`", [Key]), Data)
end.
-decode_element(Data, Index) when is_tuple(Data) ->
- Error = fun(Size) ->
- S = case Size of
- 1 -> "s";
- _ -> ""
- end,
- Msg = list_to_binary(["Tuple of at least ", integer_to_list(Size), S, " elements"]),
- decode_error_msg(Msg, Data)
+
+decode_tuple_error(Size, Data) ->
+ S = case Size of
+ 1 -> "";
+ _ -> "s"
end,
+ Msg = list_to_binary([
+ "Tuple of at least ", integer_to_list(Size), " element", S
+ ]),
+ decode_error_msg(Msg, Data).
+
+decode_element(Data, Index) when is_tuple(Data) ->
Size = tuple_size(Data),
case Index >= 0 of
true -> case Index < Size of
true -> {ok, element(Index + 1, Data)};
- false -> Error(Index + 1)
+ false -> decode_tuple_error(Index + 1, Data)
end;
false -> case abs(Index) < Size of
true -> {ok, element(Size + Index + 1, Data)};
- false -> Error(abs(Index))
+ false -> decode_tuple_error(abs(Index), Data)
end
end;
-decode_element(Data, _Position) ->
- decode_error_msg(<<"Tuple of at least 1 element">>, Data).
+decode_element(Data, Index) ->
+ Size = case Index < 0 of
+ true -> abs(Index);
+ false -> Index + 1
+ end,
+ decode_tuple_error(Size, Data).
decode_optional(Term, F) ->
Decode = fun(Inner) ->
diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js
index 7ecbe11..b743c03 100644
--- a/src/gleam_stdlib.js
+++ b/src/gleam_stdlib.js
@@ -518,24 +518,27 @@ export function decode_bit_string(data) {
: decoder_error("BitString", data);
}
+function decode_tuple_error(size, data) {
+ return decoder_error(
+ `Tuple of at least ${size} element${size == 1 ? "" : "s"}`,
+ data
+ );
+}
+
export function decode_element(data, index) {
- let error = (size) =>
- decoder_error(
- `Tuple of at least ${size} element${size == 1 ? "" : "s"}`,
- data
- );
- if (!Array.isArray(data)) return error(index < 0 ? 1 : index + 1);
+ if (!Array.isArray(data))
+ return decode_tuple_error(index < 0 ? Math.abs(index) : index + 1, data);
if (index >= 0) {
if (index < data.length) {
return new Ok(data[index]);
} else {
- return error(index + 1);
+ return decode_tuple_error(index + 1, data);
}
} else {
if (Math.abs(index) <= data.length) {
return new Ok(data[data.length + index]);
} else {
- return error(Math.abs(index));
+ return decode_tuple_error(Math.abs(index), data);
}
}
}
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index 1bf0eee..21fb98c 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -292,6 +292,14 @@ pub fn element_test() {
1
|> dynamic.from
+ |> dynamic.element(-3)
+ |> should.equal(Error(DecodeError(
+ expected: "Tuple of at least 3 elements",
+ found: "Int",
+ )))
+
+ 1
+ |> dynamic.from
|> dynamic.element(0)
|> should.equal(Error(DecodeError(
expected: "Tuple of at least 1 element",