struct json_parser {
struct istream *input;
uoff_t highwater_offset;
+ enum json_parser_flags flags;
const unsigned char *start, *end, *data;
const char *error;
parser = i_new(struct json_parser, 1);
parser->input = input;
+ parser->flags = flags;
parser->value = str_new(default_pool, 128);
i_array_init(&parser->nesting, 8);
i_stream_ref(input);
if (count == 1) {
/* closing root */
parser->state = JSON_STATE_DONE;
- return 0;
+ if ((parser->flags & JSON_PARSER_NO_ROOT_OBJECT) == 0)
+ return 0;
+ /* we want to return the ending "]" or "}" to caller */
+ return 1;
}
/* closing a nested object */
static void test_json_parser_primitive_values(void)
{
- static const char *test_inputs[] = {
- "\"hello\"",
- "null",
- "1234",
- "1234.1234",
- "{}",
- "[]",
- "true",
- "false"
+ static struct {
+ const char *str;
+ int ret;
+ } test_inputs[] = {
+ { "\"hello\"", 1 },
+ { "null", 1 },
+ { "1234", 1 },
+ { "1234.1234", 1 },
+ { "{}", 2 },
+ { "[]", 2 },
+ { "true", 1 },
+ { "false", 1 }
};
unsigned int i;
test_begin("json_parser (primitives)");
for (i = 0; i < N_ELEMENTS(test_inputs); i++)
- test_assert_idx(test_json_parse_input(test_inputs[i], JSON_PARSER_NO_ROOT_OBJECT) == 1, i);
+ test_assert_idx(test_json_parse_input(test_inputs[i].str, JSON_PARSER_NO_ROOT_OBJECT) == test_inputs[i].ret, i);
test_end();
}