From fd3c6af50b3ada7fbf377277f6ee4d27f3fdc229 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sun, 17 Jul 2011 17:50:03 -0700 Subject: [PATCH] new encoder now handles incomplete input --- src/jsx_encoder.erl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index 668d127..eb90240 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -59,6 +59,12 @@ list_or_object([start_object|Forms], Stack) -> {event, start_object, fun() -> key(Forms, [object] ++ Stack) end}; list_or_object([start_array|Forms], Stack) -> {event, start_array, fun() -> value(Forms, [array] ++ Stack) end}; +list_or_object([], Stack) -> + {incomplete, fun(end_stream) -> + {error, {badjson, []}} + ; (Stream) -> + list_or_object(Stream, Stack) + end}; list_or_object(Forms, _) -> {error, {badjson, Forms}}. @@ -66,6 +72,12 @@ key([{key, Key}|Forms], Stack) when is_list(Key) -> {event, {key, Key}, fun() -> value(Forms, Stack) end}; key([end_object|Forms], [object|Stack]) -> {event, end_object, fun() -> maybe_done(Forms, Stack) end}; +key([], Stack) -> + {incomplete, fun(end_stream) -> + {error, {badjson, []}} + ; (Stream) -> + key(Stream, Stack) + end}; key(Forms, _) -> {error, {badjson, Forms}}. @@ -83,6 +95,12 @@ value([start_array|Forms], Stack) -> {event, start_array, fun() -> value(Forms, [array] ++ Stack) end}; value([end_array|Forms], [array|Stack]) -> {event, end_array, fun() -> maybe_done(Forms, Stack) end}; +value([], Stack) -> + {incomplete, fun(end_stream) -> + {error, {badjson, []}} + ; (Stream) -> + value(Stream, Stack) + end}; value(Forms, _) -> {error, {badjson, Forms}}. @@ -93,6 +111,12 @@ maybe_done([end_array|Forms], [array|Stack]) -> {event, end_array, fun() -> maybe_done(Forms, Stack) end}; maybe_done(Forms, [object|_] = Stack) -> key(Forms, Stack); maybe_done(Forms, [array|_] = Stack) -> value(Forms, Stack); +maybe_done([], Stack) -> + {incomplete, fun(end_stream) -> + {error, {badjson, []}} + ; (Stream) -> + maybe_done(Stream, Stack) + end}; maybe_done(Forms, _) -> {error, {badjson, Forms}}.