decoder returns values in favor of incomplete when possible, use opt 'explicit_end' to revert to prior behaviour

This commit is contained in:
alisdair sullivan 2011-10-25 20:52:39 -07:00
parent 6f2c137a2e
commit 30e6745f53
2 changed files with 10 additions and 2 deletions

View file

@ -477,6 +477,8 @@ zero(<<?decimalpoint, Rest/binary>>, Out, [Acc|Stack], Opts) ->
initial_decimal(Rest, Out, [{Acc, []}|Stack], Opts);
zero(<<S, Rest/binary>>, Out, [Acc|Stack], Opts) when ?is_whitespace(S) ->
?event([format_number(Acc)], maybe_done, Rest, Out, Stack, Opts);
zero(<<>>, Out, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
?event([format_number(Acc)], maybe_done, <<>>, Out, Stack, Opts);
zero(<<>>, Out, Stack, Opts) ->
?incomplete(zero, <<>>, Out, Stack, Opts);
zero(Bin, Out, Stack, Opts) ->
@ -501,6 +503,8 @@ integer(<<S, Rest/binary>>, Out, [Acc|Stack], Opts) when S =:= $e; S =:= $E ->
e(Rest, Out, [{Acc, [], []}|Stack], Opts);
integer(<<S, Rest/binary>>, Out, [Acc|Stack], Opts) when ?is_whitespace(S) ->
?event([format_number(Acc)], maybe_done, Rest, Out, Stack, Opts);
integer(<<>>, Out, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
?event([format_number(Acc)], maybe_done, <<>>, Out, Stack, Opts);
integer(<<>>, Out, Stack, Opts) ->
?incomplete(integer, <<>>, Out, Stack, Opts);
integer(Bin, Out, Stack, Opts) ->
@ -532,6 +536,8 @@ decimal(<<S, Rest/binary>>, Out, [{Int, Frac}|Stack], Opts)
e(Rest, Out, [{Int, Frac, []}|Stack], Opts);
decimal(<<S, Rest/binary>>, Out, [Acc|Stack], Opts) when ?is_whitespace(S) ->
?event([format_number(Acc)], maybe_done, Rest, Out, Stack, Opts);
decimal(<<>>, Out, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
?event([format_number(Acc)], maybe_done, <<>>, Out, Stack, Opts);
decimal(<<>>, Out, Stack, Opts) ->
?incomplete(decimal, <<>>, Out, Stack, Opts);
decimal(Bin, Out, Stack, Opts) ->
@ -572,6 +578,8 @@ exp(<<?comma, Rest/binary>>, Out, [Acc, array|Stack], Opts) ->
?event([format_number(Acc)], value, Rest, Out, [array|Stack], Opts);
exp(<<S, Rest/binary>>, Out, [Acc|Stack], Opts) when ?is_whitespace(S) ->
?event([format_number(Acc)], maybe_done, Rest, Out, Stack, Opts);
exp(<<>>, Out, [Acc|Stack], Opts = #opts{explicit_end=false}) ->
?event([format_number(Acc)], maybe_done, <<>>, Out, Stack, Opts);
exp(<<>>, Out, Stack, Opts) ->
?incomplete(exp, <<>>, Out, Stack, Opts);
exp(Bin, Out, Stack, Opts) ->

View file

@ -155,8 +155,8 @@ basic_test_() ->
[
{"empty object", ?_assert(format(<<"{}">>, []) =:= <<"{}">>)},
{"empty array", ?_assert(format(<<"[]">>, []) =:= <<"[]">>)},
{"naked integer", ?_assert(format([{integer, 123}], []) =:= <<"123">>)},
{"naked float", ?_assert(format([{float, 1.23}], []) =:= <<"1.23">>)},
{"naked integer", ?_assert(format(<<"123">>, []) =:= <<"123">>)},
{"naked float", ?_assert(format(<<"1.23">>, []) =:= <<"1.23">>)},
{"naked string", ?_assert(format(<<"\"hi\"">>, []) =:= <<"\"hi\"">>)},
{"naked literal", ?_assert(format(<<"true">>, []) =:= <<"true">>)},
{"simple object",