aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-09-11 15:00:27 +0100
committerLouis Pilfold <louis@lpil.uk>2021-09-11 15:00:27 +0100
commitfe9aa89e6d595599a8c33b50cb206cb71b4d8a19 (patch)
tree5f951786bd989974bd312f7e69da50e4a0b0bb5c
parentff8be8c4e25220e1fae4bbb4cbd20d1f2072aae0 (diff)
downloadgleam_stdlib-fe9aa89e6d595599a8c33b50cb206cb71b4d8a19.tar.gz
gleam_stdlib-fe9aa89e6d595599a8c33b50cb206cb71b4d8a19.zip
JS decode field for maps
-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() {