Small refactoring of emitter

- Make API more clear for using as standalone json emitter
- Support cases that weren't possible before, e.g.
	- emitting primitive values in an array
	- emitting nested arrays
This commit is contained in:
Tyler Etzel
2018-07-05 10:31:43 -07:00
committed by David Goldblatt
parent 41b7372ead
commit eb261e53a6
3 changed files with 345 additions and 243 deletions

View File

@@ -169,7 +169,7 @@ static void emit_nested_dict(emitter_t *emitter) {
emitter_end(emitter);
}
static const char *nested_dict_json =
static const char *nested_object_json =
"{\n"
"\t\"json1\": {\n"
"\t\t\"json2\": {\n"
@@ -183,7 +183,7 @@ static const char *nested_dict_json =
"\t}\n"
"}\n";
static const char *nested_dict_table =
static const char *nested_object_table =
"Dict 1\n"
" Dict 2\n"
" A primitive: 123\n"
@@ -192,8 +192,8 @@ static const char *nested_dict_table =
" Another primitive: 123\n";
TEST_BEGIN(test_nested_dict) {
assert_emit_output(&emit_nested_dict, nested_dict_json,
nested_dict_table);
assert_emit_output(&emit_nested_dict, nested_object_json,
nested_object_table);
}
TEST_END
@@ -256,13 +256,14 @@ emit_modal(emitter_t *emitter) {
int val = 123;
emitter_begin(emitter);
emitter_dict_begin(emitter, "j0", "T0");
emitter_json_dict_begin(emitter, "j1");
emitter_json_key(emitter, "j1");
emitter_json_object_begin(emitter);
emitter_kv(emitter, "i1", "I1", emitter_type_int, &val);
emitter_json_kv(emitter, "i2", emitter_type_int, &val);
emitter_table_kv(emitter, "I3", emitter_type_int, &val);
emitter_table_dict_begin(emitter, "T1");
emitter_kv(emitter, "i4", "I4", emitter_type_int, &val);
emitter_json_dict_end(emitter); /* Close j1 */
emitter_json_object_end(emitter); /* Close j1 */
emitter_kv(emitter, "i5", "I5", emitter_type_int, &val);
emitter_table_dict_end(emitter); /* Close T1 */
emitter_kv(emitter, "i6", "I6", emitter_type_int, &val);
@@ -302,24 +303,26 @@ emit_json_arr(emitter_t *emitter) {
int ival = 123;
emitter_begin(emitter);
emitter_json_dict_begin(emitter, "dict");
emitter_json_arr_begin(emitter, "arr");
emitter_json_arr_obj_begin(emitter);
emitter_json_key(emitter, "dict");
emitter_json_object_begin(emitter);
emitter_json_key(emitter, "arr");
emitter_json_array_begin(emitter);
emitter_json_object_begin(emitter);
emitter_json_kv(emitter, "foo", emitter_type_int, &ival);
emitter_json_arr_obj_end(emitter); /* Close arr[0] */
emitter_json_object_end(emitter); /* Close arr[0] */
/* arr[1] and arr[2] are primitives. */
emitter_json_arr_value(emitter, emitter_type_int, &ival);
emitter_json_arr_value(emitter, emitter_type_int, &ival);
emitter_json_arr_obj_begin(emitter);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_object_begin(emitter);
emitter_json_kv(emitter, "bar", emitter_type_int, &ival);
emitter_json_kv(emitter, "baz", emitter_type_int, &ival);
emitter_json_arr_obj_end(emitter); /* Close arr[3]. */
emitter_json_arr_end(emitter); /* Close arr. */
emitter_json_dict_end(emitter); /* Close dict. */
emitter_json_object_end(emitter); /* Close arr[3]. */
emitter_json_array_end(emitter); /* Close arr. */
emitter_json_object_end(emitter); /* Close dict. */
emitter_end(emitter);
}
static const char *json_arr_json =
static const char *json_array_json =
"{\n"
"\t\"dict\": {\n"
"\t\t\"arr\": [\n"
@@ -336,10 +339,62 @@ static const char *json_arr_json =
"\t}\n"
"}\n";
static const char *json_arr_table = "";
static const char *json_array_table = "";
TEST_BEGIN(test_json_arr) {
assert_emit_output(&emit_json_arr, json_arr_json, json_arr_table);
assert_emit_output(&emit_json_arr, json_array_json, json_array_table);
}
TEST_END
static void
emit_json_nested_array(emitter_t *emitter) {
int ival = 123;
char *sval = "foo";
emitter_begin(emitter);
emitter_json_array_begin(emitter);
emitter_json_array_begin(emitter);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_value(emitter, emitter_type_string, &sval);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_value(emitter, emitter_type_string, &sval);
emitter_json_array_end(emitter);
emitter_json_array_begin(emitter);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_array_end(emitter);
emitter_json_array_begin(emitter);
emitter_json_value(emitter, emitter_type_string, &sval);
emitter_json_value(emitter, emitter_type_int, &ival);
emitter_json_array_end(emitter);
emitter_json_array_begin(emitter);
emitter_json_array_end(emitter);
emitter_json_array_end(emitter);
emitter_end(emitter);
}
static const char *json_nested_array_json =
"{\n"
"\t[\n"
"\t\t[\n"
"\t\t\t123,\n"
"\t\t\t\"foo\",\n"
"\t\t\t123,\n"
"\t\t\t\"foo\"\n"
"\t\t],\n"
"\t\t[\n"
"\t\t\t123\n"
"\t\t],\n"
"\t\t[\n"
"\t\t\t\"foo\",\n"
"\t\t\t123\n"
"\t\t],\n"
"\t\t[\n"
"\t\t]\n"
"\t]\n"
"}\n";
TEST_BEGIN(test_json_nested_arr) {
assert_emit_output(&emit_json_nested_array, json_nested_array_json,
json_array_table);
}
TEST_END
@@ -409,5 +464,6 @@ main(void) {
test_types,
test_modal,
test_json_arr,
test_json_nested_arr,
test_table_row);
}