aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam_stdlib.js13
-rw-r--r--test/gleam/dynamic_test.gleam50
2 files changed, 34 insertions, 29 deletions
diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js
index b7173c2..158a571 100644
--- a/src/gleam_stdlib.js
+++ b/src/gleam_stdlib.js
@@ -556,7 +556,14 @@ export function decode_option(data, decoder) {
}
export function decode_field(value, name) {
- return name in value
- ? new Ok(value[name])
- : decoder_error(`Value with field ${inspect(name)}`, value);
+ let error = () => decoder_error(`Value with field ${inspect(name)}`, value);
+ if (value instanceof Map) {
+ let entry = value.get(name);
+ return entry.isOk() ? entry : error();
+ }
+ try {
+ return name in value ? new Ok(value[name]) : error();
+ } catch {
+ return error();
+ }
}
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index ae3285b..d39d4ef 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -246,36 +246,34 @@ if javascript {
}
}
-if erlang {
- pub fn field_test() {
- map.new()
- |> map.insert("ok", 1)
- |> dynamic.from
- |> dynamic.field("ok")
- |> should.equal(Ok(dynamic.from(1)))
+pub fn field_test() {
+ map.new()
+ |> map.insert("ok", 1)
+ |> dynamic.from
+ |> dynamic.field("ok")
+ |> should.equal(Ok(dynamic.from(1)))
- map.new()
- |> map.insert("ok", 3)
- |> map.insert("error", 1)
- |> dynamic.from
- |> dynamic.field("ok")
- |> should.equal(Ok(dynamic.from(3)))
+ map.new()
+ |> map.insert("ok", 3)
+ |> map.insert("error", 1)
+ |> dynamic.from
+ |> dynamic.field("ok")
+ |> should.equal(Ok(dynamic.from(3)))
- map.new()
- |> dynamic.from
- |> dynamic.field("ok")
- |> should.be_error
+ map.new()
+ |> dynamic.from
+ |> dynamic.field("ok")
+ |> should.be_error
- 1
- |> dynamic.from
- |> dynamic.field("ok")
- |> should.be_error
+ 1
+ |> dynamic.from
+ |> dynamic.field("ok")
+ |> should.be_error
- []
- |> dynamic.from
- |> dynamic.field([])
- |> should.be_error
- }
+ []
+ |> dynamic.from
+ |> dynamic.field([])
+ |> should.be_error
}
pub fn element_test() {