From fe9aa89e6d595599a8c33b50cb206cb71b4d8a19 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Sat, 11 Sep 2021 15:00:27 +0100 Subject: JS decode field for maps --- src/gleam_stdlib.js | 13 ++++++++--- 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() { -- cgit v1.2.3