aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Saxton <peterhsaxton@gmail.com>2023-01-12 12:16:47 +0100
committerLouis Pilfold <louis@lpil.uk>2023-01-18 15:05:13 +0000
commita9d03207752a9a1fa6bace2b35c06cf14962d91f (patch)
tree68f12c68b531fb6dadb88fbccc8803feacbafc6e
parent6cd12632d0a67a1fb239a75592e420b20dfed7a7 (diff)
downloadgleam_stdlib-a9d03207752a9a1fa6bace2b35c06cf14962d91f.tar.gz
gleam_stdlib-a9d03207752a9a1fa6bace2b35c06cf14962d91f.zip
decode javascript object as maps
-rw-r--r--src/gleam_stdlib.mjs8
-rw-r--r--test/gleam/dynamic_test.gleam12
2 files changed, 19 insertions, 1 deletions
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index 112007f..4f54c4d 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -673,8 +673,14 @@ export function decode_result(data) {
return Result.isResult(data) ? new Ok(data) : decoder_error("Result", data);
}
+function decode_object_to_map(data) {
+ return typeof data === 'object' && data !== null && !Array.isArray(data)
+ ? new Ok(new Map(Object.entries(data)))
+ : decoder_error("Map", data);
+}
+
export function decode_map(data) {
- return data instanceof Map ? new Ok(data) : decoder_error("Map", data);
+ return data instanceof Map ? new Ok(data) : decode_object_to_map(data);
}
export function decode_option(data, decoder) {
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index 0caf8c5..fb425f5 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -744,6 +744,18 @@ pub fn map_test() {
|> dynamic.from
|> dynamic.map(dynamic.string, dynamic.int)
|> should.equal(Error([DecodeError(expected: "Map", found: "Int", path: [])]))
+
+ []
+ |> dynamic.from
+ |> dynamic.map(dynamic.string, dynamic.int)
+ |> should.equal(Error([DecodeError(expected: "Map", found: "List", path: [])]))
+
+ fn() { Nil }
+ |> dynamic.from
+ |> dynamic.map(dynamic.string, dynamic.int)
+ |> should.equal(Error([
+ DecodeError(expected: "Map", found: "Function", path: []),
+ ]))
}
pub fn shallow_list_test() {