aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubytree <rt@rubytree.me>2023-05-09 22:58:39 +0200
committerLouis Pilfold <louis@lpil.uk>2023-05-13 16:32:38 +0100
commit4fea7c8617aae705a30592c7661fca65f377979e (patch)
treed7eb992301688c376b59cc0deea125223a6e3ae8 /src
parent037e2c575c367666a952f99ea4d9cc42268cedec (diff)
downloadgleam_stdlib-4fea7c8617aae705a30592c7661fca65f377979e.tar.gz
gleam_stdlib-4fea7c8617aae705a30592c7661fca65f377979e.zip
Fix coerce errors messages, js tuple from list fixes
Diffstat (limited to 'src')
-rw-r--r--src/gleam_stdlib.erl10
-rw-r--r--src/gleam_stdlib.mjs33
2 files changed, 23 insertions, 20 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 79ded3f..e891202 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -99,23 +99,23 @@ decode_tuple(Data) -> decode_error_msg(<<"Tuple">>, Data).
decode_tuple2({_,_} = A) -> {ok, A};
decode_tuple2([A,B]) -> {ok, {A,B}};
-decode_tuple2(Data) -> decode_error_msg(<<"Tuple or List of 2 elements">>, Data).
+decode_tuple2(Data) -> decode_error_msg(<<"Tuple of 2 elements">>, Data).
decode_tuple3({_,_,_} = A) -> {ok, A};
decode_tuple3([A,B,C]) -> {ok, {A,B,C}};
-decode_tuple3(Data) -> decode_error_msg(<<"Tuple or List of 3 elements">>, Data).
+decode_tuple3(Data) -> decode_error_msg(<<"Tuple of 3 elements">>, Data).
decode_tuple4({_,_,_,_} = A) -> {ok, A};
decode_tuple4([A,B,C,D]) -> {ok, {A,B,C,D}};
-decode_tuple4(Data) -> decode_error_msg(<<"Tuple or List of 4 elements">>, Data).
+decode_tuple4(Data) -> decode_error_msg(<<"Tuple of 4 elements">>, Data).
decode_tuple5({_,_,_,_,_} = A) -> {ok, A};
decode_tuple5([A,B,C,D,E]) -> {ok, {A,B,C,D,E}};
-decode_tuple5(Data) -> decode_error_msg(<<"Tuple or List of 5 elements">>, Data).
+decode_tuple5(Data) -> decode_error_msg(<<"Tuple of 5 elements">>, Data).
decode_tuple6({_,_,_,_,_,_} = A) -> {ok, A};
decode_tuple6([A,B,C,D,E,F]) -> {ok, {A,B,C,D,E,F}};
-decode_tuple6(Data) -> decode_error_msg(<<"Tuple or List of 6 elements">>, Data).
+decode_tuple6(Data) -> decode_error_msg(<<"Tuple of 6 elements">>, Data).
decode_option(Term, F) ->
Decode = fun(Inner) ->
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index d9825e7..7c41cdd 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -637,26 +637,29 @@ export function decode_tuple6(data) {
}
function decode_tupleN(data, n) {
- let error_message = `Tuple or List of ${n} elements`;
-
- if (!(List.isList(data) || Array.isArray(data))) {
- return decoder_error(error_message, data);
+ if (Array.isArray(data) && data.length == n) {
+ return new Ok(data)
}
- let array = List.isList(data) ? [...data] : data;
+ let list = decode_exact_length_list(data, n)
+ if (list) return new Ok(list)
- let i = 0;
- for (; i < n; i++) {
- if (array[i] === undefined) {
- return decoder_error(error_message, data);
- }
- }
+ return decoder_error(`Tuple of ${n} elements`, data);
+}
- if (array[i] === undefined) {
- return new Ok(array);
- } else {
- return decoder_error(error_message, data);
+function decode_exact_length_list(data, n) {
+ if (!List.isList(data)) return;
+
+ let elements = []
+ let current = data
+
+ for (let i = 0; i < n; i++) {
+ if (current.isEmpty()) break;
+ elements.push(current.head)
+ current = current.tail
}
+
+ if (elements.length === n && current.isEmpty()) return elements
}
export function tuple_get(data, index) {