refactoring of eep0018

This commit is contained in:
alisdair sullivan 2010-08-07 23:01:04 -07:00
parent beaab9d909
commit bff9a38d39

View file

@ -54,19 +54,22 @@ json_to_term(JSON, Opts) ->
term_to_json(List, Opts) -> term_to_json(List, Opts) ->
case proplists:get_value(strict, Opts, true) of case proplists:get_value(strict, Opts, true) of
true when is_list(List) -> continue true when is_list(List) -> continue
; false -> continue
; true -> erlang:error(badarg) ; true -> erlang:error(badarg)
; false -> continue
end, end,
Encoding = proplists:get_value(encoding, Opts, utf8), Encoding = proplists:get_value(encoding, Opts, utf8),
jsx:format(event_generator(lists:reverse(term_to_events(List))), [{output_encoding, Encoding}] ++ Opts). jsx:format(event_generator(lists:reverse(term_to_events(List))), [{output_encoding, Encoding}] ++ Opts).
%% fake the jsx api with a closure to be passed to the pretty printer
event_generator([]) -> event_generator([]) ->
fun() -> {event, end_json, fun() -> {incomplete, fun(end_stream) -> event_generator([]) end} end} end; fun() -> {event, end_json, fun() -> {incomplete, fun(end_stream) -> event_generator([]) end} end} end;
event_generator([Next|Rest]) -> event_generator([Next|Rest]) ->
fun() -> {event, Next, event_generator(Rest)} end. fun() -> {event, Next, event_generator(Rest)} end.
%% internal for json_to_term %% parse opts for the decoder
opts_to_jsx_opts(Opts) -> opts_to_jsx_opts(Opts) ->
opts_to_jsx_opts(Opts, []). opts_to_jsx_opts(Opts, []).
@ -88,12 +91,17 @@ opts_to_jsx_opts([], Acc) ->
Acc. Acc.
%% ensure the first jsx event we get is start_object or start_array when running
%% in strict mode
collect_strict({event, Start, Next}, Acc, Opts) when Start =:= start_object; Start =:= start_array -> collect_strict({event, Start, Next}, Acc, Opts) when Start =:= start_object; Start =:= start_array ->
collect(Next(), [[]|Acc], Opts); collect(Next(), [[]|Acc], Opts);
collect_strict(_, _, _) -> collect_strict(_, _, _) ->
erlang:error(badarg). erlang:error(badarg).
%% collect decoder events and convert to eep0018 format
collect({event, Start, Next}, Acc, Opts) when Start =:= start_object; Start =:= start_array -> collect({event, Start, Next}, Acc, Opts) when Start =:= start_object; Start =:= start_array ->
collect(Next(), [[]|Acc], Opts); collect(Next(), [[]|Acc], Opts);
@ -137,6 +145,8 @@ collect({event, Event, Next}, [Key, Current|Rest], Opts) ->
collect(_, _, _) -> erlang:error(badarg). collect(_, _, _) -> erlang:error(badarg).
%% helper functions for converting jsx events to eep0018 formats
event({string, String}, _Opts) -> event({string, String}, _Opts) ->
unicode:characters_to_binary(String); unicode:characters_to_binary(String);
event({key, Key}, Opts) -> event({key, Key}, Opts) ->
@ -163,7 +173,7 @@ event({literal, Literal}, _Opts) ->
Literal. Literal.
%% internal for term_to_json %% convert eep0018 representation to jsx events. note special casing for the empty object
term_to_events([{}]) -> term_to_events([{}]) ->
[end_object, start_object]; [end_object, start_object];