diff --git a/src/hocon_tconf.erl b/src/hocon_tconf.erl index ac908b3..3e7dc10 100644 --- a/src/hocon_tconf.erl +++ b/src/hocon_tconf.erl @@ -522,7 +522,9 @@ map_one_field_non_hidden(FieldType, FieldSchema, FieldValue0, Opts) -> {Acc, FieldValue} end. -maybe_computed(FieldSchema, #{} = CheckedValue, Opts) -> +maybe_computed(_FieldSchema, CheckedValue, #{make_serializable := true}) -> + CheckedValue; +maybe_computed(FieldSchema, #{} = CheckedValue, #{format := map} = Opts) -> case field_schema(FieldSchema, computed) of Fn when is_function(Fn, 2) -> Computed = Fn(CheckedValue, Opts), diff --git a/test/hocon_tconf_tests.erl b/test/hocon_tconf_tests.erl index 7e85c23..fa89028 100644 --- a/test/hocon_tconf_tests.erl +++ b/test/hocon_tconf_tests.erl @@ -2760,4 +2760,27 @@ computed_fields_test() -> ?assertEqual(0, counters:get(Counter, 2)), %% Bag is called ?assertEqual(1, counters:get(Counter, 3)), + + %% Computed values shouldn't show up in raw configurations to be serialized. + AssertNoComputed = fun + Rec(M) when is_map(M) -> + case is_map_key(?COMPUTED, M) of + true -> + error({should_not_have_computed, M}); + false -> + maps:foreach(fun(_K, V) -> Rec(V) end, M) + end; + Rec(Xs) when is_list(Xs) -> + lists:foreach(Rec, Xs); + Rec(_X) -> + ok + end, + Res3 = #{} = hocon_tconf:check_plain(Sc, Data, #{make_serializable => true}), + AssertNoComputed(Res3), + %% Computed values shouldn't show up when handling rich maps + BinaryHocon = hocon_pp:do(Data, #{}), + {ok, RichmapData} = hocon:binary(BinaryHocon, #{format => richmap}), + Res4 = #{} = hocon_tconf:check_plain(Sc, RichmapData, #{format => richmap}), + AssertNoComputed(Res4), + ok.