From 6a56aa5fe1f69b54b1b2ab4a9a32a818d5128f86 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Sat, 1 Jan 2022 22:01:49 +0000 Subject: Field requires a type --- src/gleam/dynamic.gleam | 9 +++++++-- test/gleam/dynamic_test.gleam | 26 +++++++++++++++++++------- 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 } -- cgit v1.2.3