diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-09-11 15:00:27 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-09-11 15:00:27 +0100 |
commit | fe9aa89e6d595599a8c33b50cb206cb71b4d8a19 (patch) | |
tree | 5f951786bd989974bd312f7e69da50e4a0b0bb5c | |
parent | ff8be8c4e25220e1fae4bbb4cbd20d1f2072aae0 (diff) | |
download | gleam_stdlib-fe9aa89e6d595599a8c33b50cb206cb71b4d8a19.tar.gz gleam_stdlib-fe9aa89e6d595599a8c33b50cb206cb71b4d8a19.zip |
JS decode field for maps
-rw-r--r-- | src/gleam_stdlib.js | 13 | ||||
-rw-r--r-- | test/gleam/dynamic_test.gleam | 50 |
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() { |