diff options
author | rubytree <rt@rubytree.me> | 2023-05-09 22:58:39 +0200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-05-13 16:32:38 +0100 |
commit | 4fea7c8617aae705a30592c7661fca65f377979e (patch) | |
tree | d7eb992301688c376b59cc0deea125223a6e3ae8 /src | |
parent | 037e2c575c367666a952f99ea4d9cc42268cedec (diff) | |
download | gleam_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.erl | 10 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 33 |
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) { |