minor refactoring of jsx_decoder in prep for post_decode hook
This commit is contained in:
parent
7e242b7e1e
commit
ded212c397
1 changed files with 94 additions and 129 deletions
|
@ -128,6 +128,11 @@ decoder(Handler, State, Opts) ->
|
||||||
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
|
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
|
||||||
|
|
||||||
|
|
||||||
|
handle_event([], Handler, _Opts) -> Handler;
|
||||||
|
handle_event([Event|Rest], Handler, Opts) -> handle_event(Rest, handle_event(Event, Handler, Opts), Opts);
|
||||||
|
handle_event(Event, {Handler, State}, _Opts) -> {Handler, Handler:handle_event(Event, State)}.
|
||||||
|
|
||||||
|
|
||||||
start(<<16#ef, Rest/binary>>, Handler, Stack, Opts) ->
|
start(<<16#ef, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
maybe_bom(Rest, Handler, Stack, Opts);
|
maybe_bom(Rest, Handler, Stack, Opts);
|
||||||
start(<<>>, Handler, Stack, Opts) ->
|
start(<<>>, Handler, Stack, Opts) ->
|
||||||
|
@ -168,10 +173,10 @@ value(<<?zero, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
zero(Rest, Handler, [[$0]|Stack], Opts);
|
zero(Rest, Handler, [[$0]|Stack], Opts);
|
||||||
value(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_nonzero(S) ->
|
value(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_nonzero(S) ->
|
||||||
integer(Rest, Handler, [[S]|Stack], Opts);
|
integer(Rest, Handler, [[S]|Stack], Opts);
|
||||||
value(<<?start_object, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
value(<<?start_object, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
object(Rest, {Handler, Handler:handle_event(start_object, State)}, [key|Stack], Opts);
|
object(Rest, handle_event(start_object, Handler, Opts), [key|Stack], Opts);
|
||||||
value(<<?start_array, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
value(<<?start_array, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
array(Rest, {Handler, Handler:handle_event(start_array, State)}, [array|Stack], Opts);
|
array(Rest, handle_event(start_array, Handler, Opts), [array|Stack], Opts);
|
||||||
value(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
value(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||||
value(Rest, Handler, Stack, Opts);
|
value(Rest, Handler, Stack, Opts);
|
||||||
value(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
value(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
||||||
|
@ -186,8 +191,8 @@ object(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
object(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quoted_strings=true}) ->
|
object(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quoted_strings=true}) ->
|
||||||
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
||||||
object(<<?end_object, Rest/binary>>, {Handler, State}, [key|Stack], Opts) ->
|
object(<<?end_object, Rest/binary>>, Handler, [key|Stack], Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(end_object, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(end_object, Handler, Opts), Stack, Opts);
|
||||||
object(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
object(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||||
object(Rest, Handler, Stack, Opts);
|
object(Rest, Handler, Stack, Opts);
|
||||||
object(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
object(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
||||||
|
@ -214,12 +219,12 @@ array(<<?zero, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
zero(Rest, Handler, [[$0]|Stack], Opts);
|
zero(Rest, Handler, [[$0]|Stack], Opts);
|
||||||
array(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_nonzero(S) ->
|
array(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_nonzero(S) ->
|
||||||
integer(Rest, Handler, [[S]|Stack], Opts);
|
integer(Rest, Handler, [[S]|Stack], Opts);
|
||||||
array(<<?start_object, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
array(<<?start_object, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
object(Rest, {Handler, Handler:handle_event(start_object, State)}, [key|Stack], Opts);
|
object(Rest, handle_event(start_object, Handler, Opts), [key|Stack], Opts);
|
||||||
array(<<?start_array, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
array(<<?start_array, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
array(Rest, {Handler, Handler:handle_event(start_array, State)}, [array|Stack], Opts);
|
array(Rest, handle_event(start_array, Handler, Opts), [array|Stack], Opts);
|
||||||
array(<<?end_array, Rest/binary>>, {Handler, State}, [array|Stack], Opts) ->
|
array(<<?end_array, Rest/binary>>, Handler, [array|Stack], Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(end_array, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(end_array, Handler, Opts), Stack, Opts);
|
||||||
array(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
array(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||||
array(Rest, Handler, Stack, Opts);
|
array(Rest, Handler, Stack, Opts);
|
||||||
array(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
array(<<?solidus, Rest/binary>>, Handler, Stack, Opts=#opts{comments=true}) ->
|
||||||
|
@ -279,14 +284,14 @@ string(<<32, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 32)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 32)|Stack], Opts);
|
||||||
string(<<33, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
string(<<33, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 33)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 33)|Stack], Opts);
|
||||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts) ->
|
string(<<?doublequote, Rest/binary>>, Handler, S, Opts) ->
|
||||||
case S of
|
case S of
|
||||||
[Acc, key|Stack] ->
|
[Acc, key|Stack] ->
|
||||||
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|Stack], Opts);
|
colon(Rest, handle_event({key, ?end_seq(Acc)}, Handler, Opts), [key|Stack], Opts);
|
||||||
[_Acc, single_quote|_Stack] ->
|
[_Acc, single_quote|_Stack] ->
|
||||||
?error([<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts]);
|
?error([<<?doublequote, Rest/binary>>, Handler, S, Opts]);
|
||||||
[Acc|Stack] ->
|
[Acc|Stack] ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, Stack, Opts)
|
maybe_done(Rest, handle_event({string, ?end_seq(Acc)}, Handler, Opts), Stack, Opts)
|
||||||
end;
|
end;
|
||||||
string(<<35, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
string(<<35, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 35)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 35)|Stack], Opts);
|
||||||
|
@ -296,19 +301,19 @@ string(<<37, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 37)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 37)|Stack], Opts);
|
||||||
string(<<38, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
string(<<38, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 38)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 38)|Stack], Opts);
|
||||||
string(<<?singlequote, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) ->
|
string(<<?singlequote, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
case Opts#opts.single_quoted_strings of
|
case Opts#opts.single_quoted_strings of
|
||||||
true ->
|
true ->
|
||||||
case Stack of
|
case Stack of
|
||||||
[single_quote, key|S] ->
|
[single_quote, key|S] ->
|
||||||
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|S], Opts)
|
colon(Rest, handle_event({key, ?end_seq(Acc)}, Handler, Opts), [key|S], Opts)
|
||||||
; [single_quote|S] ->
|
; [single_quote|S] ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, S, Opts)
|
maybe_done(Rest, handle_event({string, ?end_seq(Acc)}, Handler, Opts), S, Opts)
|
||||||
; _ ->
|
; _ ->
|
||||||
string(Rest, {Handler, State}, [?acc_seq(Acc, maybe_replace(?singlequote, Opts))|Stack], Opts)
|
string(Rest, Handler, [?acc_seq(Acc, maybe_replace(?singlequote, Opts))|Stack], Opts)
|
||||||
end
|
end
|
||||||
; false ->
|
; false ->
|
||||||
string(Rest, {Handler, State}, [?acc_seq(Acc, ?singlequote)|Stack], Opts)
|
string(Rest, Handler, [?acc_seq(Acc, ?singlequote)|Stack], Opts)
|
||||||
end;
|
end;
|
||||||
string(<<40, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
string(<<40, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
string(Rest, Handler, [?acc_seq(Acc, 40)|Stack], Opts);
|
string(Rest, Handler, [?acc_seq(Acc, 40)|Stack], Opts);
|
||||||
|
@ -729,32 +734,22 @@ negative(Bin, Handler, Stack, Opts) ->
|
||||||
?error([Bin, Handler, Stack, Opts]).
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
zero(<<?end_object, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
zero(<<?end_object, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
maybe_done(
|
maybe_done(Rest, handle_event([format_number(Acc), end_object], Handler, Opts), Stack, Opts);
|
||||||
Rest,
|
zero(<<?end_array, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
{Handler, Handler:handle_event(end_object, Handler:handle_event(format_number(Acc), State))},
|
maybe_done(Rest, handle_event(end_array, handle_event(format_number(Acc), Handler, Opts), Opts), Stack, Opts);
|
||||||
Stack,
|
zero(<<?comma, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
Opts
|
key(Rest, handle_event(format_number(Acc), Handler, Opts), [key|Stack], Opts);
|
||||||
);
|
zero(<<?comma, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
zero(<<?end_array, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
value(Rest, handle_event(format_number(Acc), Handler, Opts), [array|Stack], Opts);
|
||||||
maybe_done(
|
|
||||||
Rest,
|
|
||||||
{Handler, Handler:handle_event(end_array, Handler:handle_event(format_number(Acc), State))},
|
|
||||||
Stack,
|
|
||||||
Opts
|
|
||||||
);
|
|
||||||
zero(<<?comma, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
|
||||||
key(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [key|Stack], Opts);
|
|
||||||
zero(<<?comma, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
|
||||||
value(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [array|Stack], Opts);
|
|
||||||
zero(<<?decimalpoint, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
zero(<<?decimalpoint, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
initial_decimal(Rest, Handler, [{Acc, []}|Stack], Opts);
|
initial_decimal(Rest, Handler, [{Acc, []}|Stack], Opts);
|
||||||
zero(<<S, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
zero(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
zero(<<?solidus, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts=#opts{comments=true}) ->
|
zero(<<?solidus, Rest/binary>>, Handler, [Acc|Stack], Opts=#opts{comments=true}) ->
|
||||||
comment(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [maybe_done|Stack], Opts);
|
comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts);
|
||||||
zero(<<>>, {Handler, State}, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
zero(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
||||||
maybe_done(<<>>, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
zero(<<>>, Handler, Stack, Opts) ->
|
zero(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(zero, <<>>, Handler, Stack, Opts);
|
?incomplete(zero, <<>>, Handler, Stack, Opts);
|
||||||
zero(Bin, Handler, Stack, Opts) ->
|
zero(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -763,36 +758,26 @@ zero(Bin, Handler, Stack, Opts) ->
|
||||||
|
|
||||||
integer(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_nonzero(S) ->
|
integer(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_nonzero(S) ->
|
||||||
integer(Rest, Handler, [[S] ++ Acc|Stack], Opts);
|
integer(Rest, Handler, [[S] ++ Acc|Stack], Opts);
|
||||||
integer(<<?end_object, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
integer(<<?end_object, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
maybe_done(
|
maybe_done(Rest, handle_event([format_number(Acc), end_object], Handler, Opts), Stack, Opts);
|
||||||
Rest,
|
integer(<<?end_array, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
{Handler, Handler:handle_event(end_object, Handler:handle_event(format_number(Acc), State))},
|
maybe_done(Rest, handle_event([format_number(Acc), end_array], Handler, Opts), Stack, Opts);
|
||||||
Stack,
|
integer(<<?comma, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
Opts
|
key(Rest, handle_event(format_number(Acc), Handler, Opts), [key|Stack], Opts);
|
||||||
);
|
integer(<<?comma, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
integer(<<?end_array, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
value(Rest, handle_event(format_number(Acc), Handler, Opts), [array|Stack], Opts);
|
||||||
maybe_done(
|
|
||||||
Rest,
|
|
||||||
{Handler, Handler:handle_event(end_array, Handler:handle_event(format_number(Acc), State))},
|
|
||||||
Stack,
|
|
||||||
Opts
|
|
||||||
);
|
|
||||||
integer(<<?comma, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
|
||||||
key(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [key|Stack], Opts);
|
|
||||||
integer(<<?comma, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
|
||||||
value(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [array|Stack], Opts);
|
|
||||||
integer(<<?decimalpoint, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
integer(<<?decimalpoint, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
initial_decimal(Rest, Handler, [{Acc, []}|Stack], Opts);
|
initial_decimal(Rest, Handler, [{Acc, []}|Stack], Opts);
|
||||||
integer(<<?zero, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
integer(<<?zero, Rest/binary>>, Handler, [Acc|Stack], Opts) ->
|
||||||
integer(Rest, Handler, [[?zero] ++ Acc|Stack], Opts);
|
integer(Rest, Handler, [[?zero] ++ Acc|Stack], Opts);
|
||||||
integer(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when S =:= $e; S =:= $E ->
|
integer(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when S =:= $e; S =:= $E ->
|
||||||
e(Rest, Handler, [{Acc, [], []}|Stack], Opts);
|
e(Rest, Handler, [{Acc, [], []}|Stack], Opts);
|
||||||
integer(<<S, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
integer(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
integer(<<?solidus, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts=#opts{comments=true}) ->
|
integer(<<?solidus, Rest/binary>>, Handler, [Acc|Stack], Opts=#opts{comments=true}) ->
|
||||||
comment(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [maybe_done|Stack], Opts);
|
comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts);
|
||||||
integer(<<>>, {Handler, State}, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
integer(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
||||||
maybe_done(<<>>, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
integer(<<>>, Handler, Stack, Opts) ->
|
integer(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(integer, <<>>, Handler, Stack, Opts);
|
?incomplete(integer, <<>>, Handler, Stack, Opts);
|
||||||
integer(Bin, Handler, Stack, Opts) ->
|
integer(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -810,32 +795,22 @@ initial_decimal(Bin, Handler, Stack, Opts) ->
|
||||||
decimal(<<S, Rest/binary>>, Handler, [{Int, Frac}|Stack], Opts)
|
decimal(<<S, Rest/binary>>, Handler, [{Int, Frac}|Stack], Opts)
|
||||||
when S=:= ?zero; ?is_nonzero(S) ->
|
when S=:= ?zero; ?is_nonzero(S) ->
|
||||||
decimal(Rest, Handler, [{Int, [S] ++ Frac}|Stack], Opts);
|
decimal(Rest, Handler, [{Int, [S] ++ Frac}|Stack], Opts);
|
||||||
decimal(<<?end_object, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
decimal(<<?end_object, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
maybe_done(
|
maybe_done(Rest, handle_event([format_number(Acc), end_object], Handler, Opts), Stack, Opts);
|
||||||
Rest,
|
decimal(<<?end_array, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
{Handler, Handler:handle_event(end_object, Handler:handle_event(format_number(Acc), State))},
|
maybe_done(Rest, handle_event([format_number(Acc), end_array], Handler, Opts), Stack, Opts);
|
||||||
Stack,
|
decimal(<<?comma, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
Opts
|
key(Rest, handle_event(format_number(Acc), Handler, Opts), [key|Stack], Opts);
|
||||||
);
|
decimal(<<?comma, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
decimal(<<?end_array, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
value(Rest, handle_event(format_number(Acc), Handler, Opts), [array|Stack], Opts);
|
||||||
maybe_done(
|
|
||||||
Rest,
|
|
||||||
{Handler, Handler:handle_event(end_array, Handler:handle_event(format_number(Acc), State))},
|
|
||||||
Stack,
|
|
||||||
Opts
|
|
||||||
);
|
|
||||||
decimal(<<?comma, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
|
||||||
key(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [key|Stack], Opts);
|
|
||||||
decimal(<<?comma, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
|
||||||
value(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [array|Stack], Opts);
|
|
||||||
decimal(<<S, Rest/binary>>, Handler, [{Int, Frac}|Stack], Opts) when S =:= $e; S =:= $E ->
|
decimal(<<S, Rest/binary>>, Handler, [{Int, Frac}|Stack], Opts) when S =:= $e; S =:= $E ->
|
||||||
e(Rest, Handler, [{Int, Frac, []}|Stack], Opts);
|
e(Rest, Handler, [{Int, Frac, []}|Stack], Opts);
|
||||||
decimal(<<S, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
decimal(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
decimal(<<?solidus, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts=#opts{comments=true}) ->
|
decimal(<<?solidus, Rest/binary>>, Handler, [Acc|Stack], Opts=#opts{comments=true}) ->
|
||||||
comment(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [maybe_done|Stack], Opts);
|
comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts);
|
||||||
decimal(<<>>, {Handler, State}, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
decimal(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
||||||
maybe_done(<<>>, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
decimal(<<>>, Handler, Stack, Opts) ->
|
decimal(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(decimal, <<>>, Handler, Stack, Opts);
|
?incomplete(decimal, <<>>, Handler, Stack, Opts);
|
||||||
decimal(Bin, Handler, Stack, Opts) ->
|
decimal(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -862,30 +837,20 @@ ex(Bin, Handler, Stack, Opts) ->
|
||||||
|
|
||||||
exp(<<S, Rest/binary>>, Handler, [{Int, Frac, Exp}|Stack], Opts) when S =:= ?zero; ?is_nonzero(S) ->
|
exp(<<S, Rest/binary>>, Handler, [{Int, Frac, Exp}|Stack], Opts) when S =:= ?zero; ?is_nonzero(S) ->
|
||||||
exp(Rest, Handler, [{Int, Frac, [S] ++ Exp}|Stack], Opts);
|
exp(Rest, Handler, [{Int, Frac, [S] ++ Exp}|Stack], Opts);
|
||||||
exp(<<?end_object, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
exp(<<?end_object, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
maybe_done(
|
maybe_done(Rest, handle_event([format_number(Acc), end_object], Handler, Opts), Stack, Opts);
|
||||||
Rest,
|
exp(<<?end_array, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
{Handler, Handler:handle_event(end_object, Handler:handle_event(format_number(Acc), State))},
|
maybe_done(Rest, handle_event([format_number(Acc), end_array], Handler, Opts), Stack, Opts);
|
||||||
Stack,
|
exp(<<?comma, Rest/binary>>, Handler, [Acc, object|Stack], Opts) ->
|
||||||
Opts
|
key(Rest, handle_event(format_number(Acc), Handler, Opts), [key|Stack], Opts);
|
||||||
);
|
exp(<<?comma, Rest/binary>>, Handler, [Acc, array|Stack], Opts) ->
|
||||||
exp(<<?end_array, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
value(Rest, handle_event(format_number(Acc), Handler, Opts), [array|Stack], Opts);
|
||||||
maybe_done(
|
exp(<<S, Rest/binary>>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
||||||
Rest,
|
maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
{Handler, Handler:handle_event(end_array, Handler:handle_event(format_number(Acc), State))},
|
exp(<<?solidus, Rest/binary>>, Handler, [Acc|Stack], Opts=#opts{comments=true}) ->
|
||||||
Stack,
|
comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts);
|
||||||
Opts
|
exp(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
||||||
);
|
maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts);
|
||||||
exp(<<?comma, Rest/binary>>, {Handler, State}, [Acc, object|Stack], Opts) ->
|
|
||||||
key(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [key|Stack], Opts);
|
|
||||||
exp(<<?comma, Rest/binary>>, {Handler, State}, [Acc, array|Stack], Opts) ->
|
|
||||||
value(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [array|Stack], Opts);
|
|
||||||
exp(<<S, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) when ?is_whitespace(S) ->
|
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
|
||||||
exp(<<?solidus, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts=#opts{comments=true}) ->
|
|
||||||
comment(Rest, {Handler, Handler:handle_event(format_number(Acc), State)}, [maybe_done|Stack], Opts);
|
|
||||||
exp(<<>>, {Handler, State}, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
|
|
||||||
maybe_done(<<>>, {Handler, Handler:handle_event(format_number(Acc), State)}, Stack, Opts);
|
|
||||||
exp(<<>>, Handler, Stack, Opts) ->
|
exp(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(exp, <<>>, Handler, Stack, Opts);
|
?incomplete(exp, <<>>, Handler, Stack, Opts);
|
||||||
exp(Bin, Handler, Stack, Opts) ->
|
exp(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -918,8 +883,8 @@ tru(Bin, Handler, Stack, Opts) ->
|
||||||
?error([Bin, Handler, Stack, Opts]).
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
true(<<$e, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
true(<<$e, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event({literal, true}, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event({literal, true}, Handler, Opts), Stack, Opts);
|
||||||
true(<<>>, Handler, Stack, Opts) ->
|
true(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(true, <<>>, Handler, Stack, Opts);
|
?incomplete(true, <<>>, Handler, Stack, Opts);
|
||||||
true(Bin, Handler, Stack, Opts) ->
|
true(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -950,8 +915,8 @@ fals(Bin, Handler, Stack, Opts) ->
|
||||||
?error([Bin, Handler, Stack, Opts]).
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
false(<<$e, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
false(<<$e, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event({literal, false}, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event({literal, false}, Handler, Opts), Stack, Opts);
|
||||||
false(<<>>, Handler, Stack, Opts) ->
|
false(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(false, <<>>, Handler, Stack, Opts);
|
?incomplete(false, <<>>, Handler, Stack, Opts);
|
||||||
false(Bin, Handler, Stack, Opts) ->
|
false(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -974,8 +939,8 @@ nul(Bin, Handler, Stack, Opts) ->
|
||||||
?error([Bin, Handler, Stack, Opts]).
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
null(<<$l, Rest/binary>>, {Handler, State}, Stack, Opts) ->
|
null(<<$l, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event({literal, null}, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event({literal, null}, Handler, Opts), Stack, Opts);
|
||||||
null(<<>>, Handler, Stack, Opts) ->
|
null(<<>>, Handler, Stack, Opts) ->
|
||||||
?incomplete(null, <<>>, Handler, Stack, Opts);
|
?incomplete(null, <<>>, Handler, Stack, Opts);
|
||||||
null(Bin, Handler, Stack, Opts) ->
|
null(Bin, Handler, Stack, Opts) ->
|
||||||
|
@ -1036,12 +1001,12 @@ end_comment(Rest, Handler, [Resume|Stack], Opts) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
maybe_done(Rest, {Handler, State}, [], Opts) ->
|
maybe_done(Rest, Handler, [], Opts) ->
|
||||||
done(Rest, {Handler, Handler:handle_event(end_json, State)}, [], Opts);
|
done(Rest, handle_event(end_json, Handler, Opts), [], Opts);
|
||||||
maybe_done(<<?end_object, Rest/binary>>, {Handler, State}, [object|Stack], Opts) ->
|
maybe_done(<<?end_object, Rest/binary>>, Handler, [object|Stack], Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(end_object, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(end_object, Handler, Opts), Stack, Opts);
|
||||||
maybe_done(<<?end_array, Rest/binary>>, {Handler, State}, [array|Stack], Opts) ->
|
maybe_done(<<?end_array, Rest/binary>>, Handler, [array|Stack], Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(end_array, State)}, Stack, Opts);
|
maybe_done(Rest, handle_event(end_array, Handler, Opts), Stack, Opts);
|
||||||
maybe_done(<<?comma, Rest/binary>>, Handler, [object|Stack], Opts) ->
|
maybe_done(<<?comma, Rest/binary>>, Handler, [object|Stack], Opts) ->
|
||||||
key(Rest, Handler, [key|Stack], Opts);
|
key(Rest, Handler, [key|Stack], Opts);
|
||||||
maybe_done(<<?comma, Rest/binary>>, Handler, [array|_] = Stack, Opts) ->
|
maybe_done(<<?comma, Rest/binary>>, Handler, [array|_] = Stack, Opts) ->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue