diff --git a/src/jsx_parser.erl b/src/jsx_parser.erl index d960bde..85492a6 100644 --- a/src/jsx_parser.erl +++ b/src/jsx_parser.erl @@ -24,6 +24,7 @@ -module(jsx_parser). -export([parser/3, resume/5]). +-export([init/1, handle_event/2]). -spec parser(Handler::module(), State::any(), Config::jsx:config()) -> jsx:parser(). @@ -134,6 +135,8 @@ value([{string, String}|Tokens], Handler, Stack, Config) when is_binary(String) end; value([String|Tokens], Handler, Stack, Config) when is_binary(String) -> value([{string, String}] ++ Tokens, Handler, Stack, Config); +value([{raw, Raw}|Tokens], Handler, Stack, Config) when is_binary(Raw) -> + value((jsx:decoder(?MODULE, [], []))(Raw) ++ Tokens, Handler, Stack, Config); value([], Handler, Stack, Config) -> incomplete(value, Handler, Stack, Config); value(BadTokens, Handler, Stack, Config) when is_list(BadTokens) -> @@ -204,6 +207,13 @@ clean_string(Bin, Tokens, Handler, Stack, Config) -> end. +%% for raw input +init([]) -> []. + +handle_event(end_json, State) -> lists:reverse(State); +handle_event(Event, State) -> [Event] ++ State. + + -include("jsx_strings.hrl"). @@ -286,4 +296,21 @@ custom_incomplete_handler_test_() -> ]. +raw_test_() -> + [ + {"raw empty list", ?_assertEqual( + [start_array, end_array, end_json], + parse([{raw, <<"[]">>}], []) + )}, + {"raw empty object", ?_assertEqual( + [start_object, end_object, end_json], + parse([{raw, <<"{}">>}], []) + )}, + {"raw chunk inside stream", ?_assertEqual( + [start_object, {key, <<"key">>}, start_array, {literal, true}, end_array, end_object, end_json], + parse([start_object, {key, <<"key">>}, {raw, <<"[true]">>}, end_object], []) + )} + ]. + + -endif. \ No newline at end of file