Skip to content

Commit 1cf5e0d

Browse files
committed
fix: compute values only for maps and not when serializing raw config
1 parent dea6db6 commit 1cf5e0d

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/hocon_tconf.erl

+3-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,9 @@ map_one_field_non_hidden(FieldType, FieldSchema, FieldValue0, Opts) ->
522522
{Acc, FieldValue}
523523
end.
524524

525-
maybe_computed(FieldSchema, #{} = CheckedValue, Opts) ->
525+
maybe_computed(_FieldSchema, CheckedValue, #{make_serializable := true}) ->
526+
CheckedValue;
527+
maybe_computed(FieldSchema, #{} = CheckedValue, #{format := map} = Opts) ->
526528
case field_schema(FieldSchema, computed) of
527529
Fn when is_function(Fn, 2) ->
528530
Computed = Fn(CheckedValue, Opts),

test/hocon_tconf_tests.erl

+23
Original file line numberDiff line numberDiff line change
@@ -2760,4 +2760,27 @@ computed_fields_test() ->
27602760
?assertEqual(0, counters:get(Counter, 2)),
27612761
%% Bag is called
27622762
?assertEqual(1, counters:get(Counter, 3)),
2763+
2764+
%% Computed values shouldn't show up in raw configurations to be serialized.
2765+
AssertNoComputed = fun
2766+
Rec(M) when is_map(M) ->
2767+
case is_map_key(?COMPUTED, M) of
2768+
true ->
2769+
error({should_not_have_computed, M});
2770+
false ->
2771+
maps:foreach(fun(_K, V) -> Rec(V) end, M)
2772+
end;
2773+
Rec(Xs) when is_list(Xs) ->
2774+
lists:foreach(Rec, Xs);
2775+
Rec(_X) ->
2776+
ok
2777+
end,
2778+
Res3 = #{} = hocon_tconf:check_plain(Sc, Data, #{make_serializable => true}),
2779+
AssertNoComputed(Res3),
2780+
%% Computed values shouldn't show up when handling rich maps
2781+
BinaryHocon = hocon_pp:do(Data, #{}),
2782+
{ok, RichmapData} = hocon:binary(BinaryHocon, #{format => richmap}),
2783+
Res4 = #{} = hocon_tconf:check_plain(Sc, RichmapData, #{format => richmap}),
2784+
AssertNoComputed(Res4),
2785+
27632786
ok.

0 commit comments

Comments
 (0)