From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58203) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btaYy-00057P-Hg for qemu-devel@nongnu.org; Mon, 10 Oct 2016 09:24:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1btaYw-0007LB-Ak for qemu-devel@nongnu.org; Mon, 10 Oct 2016 09:24:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54564) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btaYw-0007Ko-2X for qemu-devel@nongnu.org; Mon, 10 Oct 2016 09:24:14 -0400 From: Eric Blake Date: Mon, 10 Oct 2016 08:23:56 -0500 Message-Id: <1476105837-9861-15-git-send-email-eblake@redhat.com> In-Reply-To: <1476105837-9861-1-git-send-email-eblake@redhat.com> References: <1476105837-9861-1-git-send-email-eblake@redhat.com> Subject: [Qemu-devel] [PATCH v6 14/15] qapi: Add 'any' support to JSON output List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: armbru@redhat.com, Michael Roth 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 --- 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