aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2022-01-01 22:24:16 +0000
committerLouis Pilfold <louis@lpil.uk>2022-01-01 22:24:16 +0000
commit08606b3dd9d4928c33da4f1eba6000626f41627d (patch)
tree665c2c68c6182b5f99b5a39176194cf9bd2303b9
parentbb4e842a641077fafb102bb104492b50b85cd50a (diff)
downloadgleam_stdlib-08606b3dd9d4928c33da4f1eba6000626f41627d.tar.gz
gleam_stdlib-08606b3dd9d4928c33da4f1eba6000626f41627d.zip
Element requires type
-rw-r--r--src/gleam/dynamic.gleam8
-rw-r--r--test/gleam/dynamic_test.gleam27
2 files changed, 21 insertions, 14 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam
index fa1b69e..82cfa2f 100644
--- a/src/gleam/dynamic.gleam
+++ b/src/gleam/dynamic.gleam
@@ -421,11 +421,12 @@ if javascript {
///
pub fn element(
from data: Dynamic,
- get index: Int,
-) -> Result(Dynamic, DecodeError) {
+ at index: Int,
+ of inner_type: Decoder(t),
+) -> Result(t, DecodeError) {
try tuple = decode_tuple(data)
let size = tuple_size(tuple)
- case index >= 0 {
+ try data = case index >= 0 {
True ->
case index < size {
True -> tuple_get(tuple, index)
@@ -437,6 +438,7 @@ pub fn element(
False -> at_least_decode_tuple_error(int.absolute_value(index), data)
}
}
+ inner_type(data)
}
fn exact_decode_tuple_error(size: Int, data: Dynamic) -> Result(a, DecodeError) {
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index 62bab63..c79bc75 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -289,17 +289,22 @@ pub fn element_test() {
ok_one_tuple
|> dynamic.from
- |> dynamic.element(0)
- |> should.equal(Ok(dynamic.from("ok")))
+ |> dynamic.element(0, dynamic.string)
+ |> should.equal(Ok("ok"))
ok_one_tuple
|> dynamic.from
- |> dynamic.element(1)
- |> should.equal(Ok(dynamic.from(1)))
+ |> dynamic.element(1, dynamic.int)
+ |> should.equal(Ok(1))
+
+ ok_one_tuple
+ |> dynamic.from
+ |> dynamic.element(1, dynamic.string)
+ |> should.equal(Error(DecodeError(expected: "String", found: "Int")))
ok_one_tuple
|> dynamic.from
- |> dynamic.element(2)
+ |> dynamic.element(2, dynamic.int)
|> should.equal(Error(DecodeError(
expected: "Tuple of at least 3 elements",
found: "Tuple of 2 elements",
@@ -307,12 +312,12 @@ pub fn element_test() {
ok_one_tuple
|> dynamic.from
- |> dynamic.element(-1)
- |> should.equal(Ok(dynamic.from(1)))
+ |> dynamic.element(-1, dynamic.int)
+ |> should.equal(Ok(1))
ok_one_tuple
|> dynamic.from
- |> dynamic.element(-3)
+ |> dynamic.element(-3, dynamic.int)
|> should.equal(Error(DecodeError(
expected: "Tuple of at least 3 elements",
found: "Tuple of 2 elements",
@@ -320,18 +325,18 @@ pub fn element_test() {
1
|> dynamic.from
- |> dynamic.element(-3)
+ |> dynamic.element(-3, dynamic.int)
|> should.equal(Error(DecodeError(expected: "Tuple", found: "Int")))
1
|> dynamic.from
- |> dynamic.element(0)
+ |> dynamic.element(0, dynamic.int)
|> should.equal(Error(DecodeError(expected: "Tuple", found: "Int")))
map.new()
|> map.insert(1, "ok")
|> dynamic.from
- |> dynamic.element(0)
+ |> dynamic.element(0, dynamic.int)
|> should.equal(Error(DecodeError(expected: "Tuple", found: "Map")))
}