diff options
author | Giacomo Cavalieri <giacomo.cavalieri@icloud.com> | 2023-04-21 15:04:50 +0200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-04-29 14:33:18 +0100 |
commit | 54b22b142d17f0fd893ec2465e53b92109aadb48 (patch) | |
tree | c7a6bba9e1c1f35e0285570cda7e4468eb9283b0 /src/gleam_stdlib.mjs | |
parent | 8924398359342ad33e99d707a3c8a7fb44d99da0 (diff) | |
download | gleam_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.mjs | 19 |
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(); } } |