[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 14/15] qapi: Add 'any' support to JSON output
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v6 14/15] qapi: Add 'any' support to JSON output |
Date: |
Mon, 10 Oct 2016 08:23:56 -0500 |
Now that we can visit any QObject, it's easy to add support
for visit_type_any() in the JSON output visitor.
Signed-off-by: Eric Blake <address@hidden>
---
v6: no change
[no v5 due to series split]
v4: new patch, split out of v3 7/18, but made simpler by
not requiring v3 12/18
---
include/qapi/json-output-visitor.h | 2 --
qapi/json-output-visitor.c | 7 ++++++
tests/test-json-output-visitor.c | 50 ++++++++++++++++++++++++++++++++++++++
3 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/include/qapi/json-output-visitor.h
b/include/qapi/json-output-visitor.h
index 94c9e0f..414f91b 100644
--- a/include/qapi/json-output-visitor.h
+++ b/include/qapi/json-output-visitor.h
@@ -23,8 +23,6 @@ typedef struct JsonOutputVisitor JsonOutputVisitor;
*
* If @pretty, make the output legible with newlines and indentation;
* otherwise the output uses a single line.
- *
- * For now, this cannot be used to visit the 'any' type.
*/
Visitor *json_output_visitor_new(bool pretty, char **result);
diff --git a/qapi/json-output-visitor.c b/qapi/json-output-visitor.c
index 7d12879..5f229d2 100644
--- a/qapi/json-output-visitor.c
+++ b/qapi/json-output-visitor.c
@@ -147,6 +147,12 @@ static void json_output_type_number(Visitor *v, const char
*name, double *obj,
qstring_append_json_number(jov->str, *obj);
}
+static void json_output_type_any(Visitor *v, const char *name, QObject **obj,
+ Error **errp)
+{
+ qobject_visit_output(v, name, *obj);
+}
+
static void json_output_type_null(Visitor *v, const char *name, Error **errp)
{
JsonOutputVisitor *jov = to_jov(v);
@@ -196,6 +202,7 @@ Visitor *json_output_visitor_new(bool pretty, char **result)
v->visitor.type_bool = json_output_type_bool;
v->visitor.type_str = json_output_type_str;
v->visitor.type_number = json_output_type_number;
+ v->visitor.type_any = json_output_type_any;
v->visitor.type_null = json_output_type_null;
v->visitor.complete = json_output_complete;
v->visitor.free = json_output_free;
diff --git a/tests/test-json-output-visitor.c b/tests/test-json-output-visitor.c
index 849cf2b..a802a12 100644
--- a/tests/test-json-output-visitor.c
+++ b/tests/test-json-output-visitor.c
@@ -318,6 +318,52 @@ static void test_visitor_out_list(TestOutputVisitorData
*data,
qapi_free_TestStructList(head);
}
+static void test_visitor_out_any(TestOutputVisitorData *data,
+ const void *arg)
+{
+ const bool *pretty = arg;
+ QObject *qobj;
+ QDict *qdict;
+ const char *out;
+
+ qobj = QOBJECT(qint_from_int(-42));
+ visit_type_any(data->ov, NULL, &qobj, &error_abort);
+ out = visitor_get(data);
+ g_assert_cmpstr(out, ==, "-42");
+ qobject_decref(qobj);
+
+ visitor_reset(data);
+ qdict = qdict_new();
+ /* Ordering here is sensitive to the hashing chosen by QDict. */
+ qdict_put(qdict, "integer", qint_from_int(-42));
+ qdict_put(qdict, "list", qlist_new());
+ qdict_put(qdict, "boolean", qbool_from_bool(true));
+ qdict_put(qdict, "string", qstring_from_str("foo"));
+ qobj = QOBJECT(qdict);
+ visit_type_any(data->ov, NULL, &qobj, &error_abort);
+ qobject_decref(qobj);
+ out = visitor_get(data);
+
+ if (*pretty) {
+ g_assert_cmpstr(out, ==,
+ "{\n"
+ " \"integer\": -42,\n"
+ " \"list\": [\n"
+ " ],\n"
+ " \"boolean\": true,\n"
+ " \"string\": \"foo\"\n"
+ "}");
+ } else {
+ g_assert_cmpstr(out, ==,
+ "{"
+ "\"integer\": -42, "
+ "\"list\": [], "
+ "\"boolean\": true, "
+ "\"string\": \"foo\""
+ "}");
+ }
+}
+
static void test_visitor_out_union_flat(TestOutputVisitorData *data,
const void *unused)
{
@@ -414,6 +460,10 @@ int main(int argc, char **argv)
test_visitor_out_struct_errors);
output_visitor_test_add("/visitor/json/list", &plain,
test_visitor_out_list);
+ output_visitor_test_add("/visitor/json/any", &plain,
+ test_visitor_out_any);
+ output_visitor_test_add("/visitor/json-pretty/any", &pretty,
+ test_visitor_out_any);
output_visitor_test_add("/visitor/json/union-flat", &plain,
test_visitor_out_union_flat);
output_visitor_test_add("/visitor/json/alternate", &plain,
--
2.7.4
- [Qemu-devel] [PATCH v6 04/15] qapi: Factor out JSON number formatting, (continued)
- [Qemu-devel] [PATCH v6 04/15] qapi: Factor out JSON number formatting, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 05/15] qapi: Add qstring_append_printf(), Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 06/15] qapi: Use qstring_append_chr() where appropriate, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 07/15] qstring: Add qstring_consume_str(), Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 02/15] qapi: Assert finite use of 'number', Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 12/15] qapi: Support pretty printing in JSON output visitor, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 11/15] qapi: Add JSON output visitor, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 10/15] tests: Test qobject_to_json() pretty formatting, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 14/15] qapi: Add 'any' support to JSON output,
Eric Blake <=
- [Qemu-devel] [PATCH v6 13/15] qobject: Implement qobject_to_json() atop JSON visitor, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 09/15] qobject: Consolidate qobject_to_json() calls, Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 08/15] qstring: Add qstring_wrap_str(), Eric Blake, 2016/10/10
- [Qemu-devel] [PATCH v6 08.5/15] fixup! qstring: Add qstring_wrap_str(), Eric Blake, 2016/10/11
[Qemu-devel] [PATCH v6 15/15] qemu-img: Use new JSON output formatter, Eric Blake, 2016/10/10
Re: [Qemu-devel] [PATCH v6 00/15] Add qapi-to-JSON visitor, Marc-André Lureau, 2016/10/11