aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2022-01-01 22:01:49 +0000
committerLouis Pilfold <louis@lpil.uk>2022-01-01 22:01:49 +0000
commit6a56aa5fe1f69b54b1b2ab4a9a32a818d5128f86 (patch)
tree482e13f680b2237e95c3d90140fba78239541213
parent5237f401b775e7d3381663babcaf0b8ecfcaf672 (diff)
downloadgleam_stdlib-6a56aa5fe1f69b54b1b2ab4a9a32a818d5128f86.tar.gz
gleam_stdlib-6a56aa5fe1f69b54b1b2ab4a9a32a818d5128f86.zip
Field requires a type
-rw-r--r--src/gleam/dynamic.gleam9
-rw-r--r--test/gleam/dynamic_test.gleam26
2 files changed, 26 insertions, 9 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam
index ff040db..fa1b69e 100644
--- a/src/gleam/dynamic.gleam
+++ b/src/gleam/dynamic.gleam
@@ -386,8 +386,13 @@ if javascript {
/// > field(from(123), "Hello")
/// Error(DecodeError(expected: "Map", found: "Int"))
///
-pub fn field(from value: Dynamic, named name: a) -> Result(Dynamic, DecodeError) {
- decode_field(value, name)
+pub fn field(
+ from value: Dynamic,
+ named name: a,
+ of inner_type: Decoder(t),
+) -> Result(t, DecodeError) {
+ try value = decode_field(value, name)
+ inner_type(value)
}
if erlang {
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index ea40190..54eca0c 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -246,29 +246,41 @@ pub fn field_test() {
map.new()
|> map.insert("ok", 1)
|> dynamic.from
- |> dynamic.field("ok")
- |> should.equal(Ok(dynamic.from(1)))
+ |> dynamic.field(named: "ok", of: dynamic.int)
+ |> should.equal(Ok(1))
+
+ map.new()
+ |> map.insert("ok", 1.0)
+ |> dynamic.from
+ |> dynamic.field(named: "ok", of: dynamic.float)
+ |> should.equal(Ok(1.0))
map.new()
|> map.insert("ok", 3)
|> map.insert("error", 1)
|> dynamic.from
- |> dynamic.field("ok")
- |> should.equal(Ok(dynamic.from(3)))
+ |> dynamic.field("ok", dynamic.int)
+ |> should.equal(Ok(3))
+
+ map.new()
+ |> map.insert("ok", 3)
+ |> dynamic.from
+ |> dynamic.field("ok", dynamic.float)
+ |> should.be_error
map.new()
|> dynamic.from
- |> dynamic.field("ok")
+ |> dynamic.field("ok", dynamic.int)
|> should.be_error
1
|> dynamic.from
- |> dynamic.field("ok")
+ |> dynamic.field("ok", dynamic.int)
|> should.be_error
[]
|> dynamic.from
- |> dynamic.field([])
+ |> dynamic.field("ok", dynamic.int)
|> should.be_error
}