aboutsummaryrefslogtreecommitdiff
path: root/src/gleam_stdlib.mjs
diff options
context:
space:
mode:
authorGiacomo Cavalieri <giacomo.cavalieri@icloud.com>2023-04-21 15:04:50 +0200
committerLouis Pilfold <louis@lpil.uk>2023-04-29 14:33:18 +0100
commit54b22b142d17f0fd893ec2465e53b92109aadb48 (patch)
treec7a6bba9e1c1f35e0285570cda7e4468eb9283b0 /src/gleam_stdlib.mjs
parent8924398359342ad33e99d707a3c8a7fb44d99da0 (diff)
downloadgleam_stdlib-54b22b142d17f0fd893ec2465e53b92109aadb48.tar.gz
gleam_stdlib-54b22b142d17f0fd893ec2465e53b92109aadb48.zip
Fix `dynamic.field` behaviour
Diffstat (limited to 'src/gleam_stdlib.mjs')
-rw-r--r--src/gleam_stdlib.mjs19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index 2b0a6e1..52fbc89 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -663,14 +663,23 @@ export function decode_option(data, decoder) {
}
export function decode_field(value, name) {
- let error = () => decoder_error_no_classify("field", "nothing");
- if (value instanceof PMap) {
+ let missing_field_error = () => decoder_error_no_classify("field", "nothing");
+ let not_a_map_error = () => decoder_error("Map", value);
+
+ if (value instanceof PMap || value instanceof WeakMap || value instanceof Map) {
let entry = map_get(value, name);
- return entry.isOk() ? entry : error();
+ return new Ok(entry.isOk() ? entry : missing_field_error());
+ } else if (Object.getPrototypeOf(value) == Object.prototype) {
+ return try_get_field(value, name, () => new Ok(missing_field_error()));
+ } else {
+ return try_get_field(value, name, not_a_map_error);
}
+}
+
+function try_get_field(value, field, or_else) {
try {
- return name in value ? new Ok(value[name]) : error();
+ return field in value ? new Ok(new Ok(value[field])) : or_else();
} catch {
- return error();
+ return or_else();
}
}