diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-09-09 22:09:06 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-09-09 22:09:06 +0100 |
commit | a595d4be50fe7e4e5a946bf5ed5878fa7bd42b64 (patch) | |
tree | 68c0077a2f7d6f9302768bfc7aea53feafc15eca | |
parent | 16da5a271ae7a7decbf8424d9b2acad01343622e (diff) | |
download | gleam_stdlib-a595d4be50fe7e4e5a946bf5ed5878fa7bd42b64.tar.gz gleam_stdlib-a595d4be50fe7e4e5a946bf5ed5878fa7bd42b64.zip |
Improve error messages
-rw-r--r-- | src/gleam_stdlib.erl | 38 | ||||
-rw-r--r-- | src/gleam_stdlib.js | 19 | ||||
-rw-r--r-- | test/gleam/dynamic_test.gleam | 8 |
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", |