diff options
author | Louis Pilfold <louis@lpil.uk> | 2022-01-01 22:24:16 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2022-01-01 22:24:16 +0000 |
commit | 08606b3dd9d4928c33da4f1eba6000626f41627d (patch) | |
tree | 665c2c68c6182b5f99b5a39176194cf9bd2303b9 | |
parent | bb4e842a641077fafb102bb104492b50b85cd50a (diff) | |
download | gleam_stdlib-08606b3dd9d4928c33da4f1eba6000626f41627d.tar.gz gleam_stdlib-08606b3dd9d4928c33da4f1eba6000626f41627d.zip |
Element requires type
-rw-r--r-- | src/gleam/dynamic.gleam | 8 | ||||
-rw-r--r-- | test/gleam/dynamic_test.gleam | 27 |
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"))) } |