Skip to content

Commit

Permalink
feat: disallow dupe keys
Browse files Browse the repository at this point in the history
  • Loading branch information
janl committed Nov 1, 2017
1 parent eeef2ee commit 3706a77
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions src/ejson/ejson.erl
Expand Up @@ -36,6 +36,9 @@ init() ->
decode(undefined) ->
throw({invalid_json, undefined});
decode(IoList) ->
dedupe_objs(decode_int(IoList)).

decode_int(IoList) ->
try
nif_decode(IoList)
catch exit:ejson_nif_not_loaded ->
Expand Down Expand Up @@ -161,6 +164,23 @@ make_ejson([Value | RevEvs], [Vals | RestStack] = _Stack) ->
make_ejson(RevEvs, [[Value | Vals] | RestStack]).


dedupe_objs({Props}) when is_list(Props) ->
RevProps = lists:reverse(Props),
{_, NewProps} = lists:foldl(fun({Key, Val}, {Seen, PropAcc}) ->
case sets:is_element(Key, Seen) of
true ->
{Seen, PropAcc};
false ->
{sets:add_element(Key, Seen), [{Key, Val} | PropAcc]}
end
end, {sets:new(), []}, RevProps),
{NewProps};
dedupe_objs(Vals) when is_list(Vals) ->
lists:map(fun dedupe_objs/1, Vals);
dedupe_objs(Val) ->
Val.


reverse_tokens(_) ->
exit(ejson_nif_not_loaded).

Expand Down

0 comments on commit 3706a77

Please sign in to comment.