From 54b22b142d17f0fd893ec2465e53b92109aadb48 Mon Sep 17 00:00:00 2001 From: Giacomo Cavalieri Date: Fri, 21 Apr 2023 15:04:50 +0200 Subject: Fix `dynamic.field` behaviour --- src/gleam_stdlib.mjs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/gleam_stdlib.mjs') 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(); } } -- cgit v1.2.3