[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v2 20/24] qapi: New qobject_input_visitor_new_str()
From: |
Markus Armbruster |
Subject: |
[Qemu-block] [PATCH v2 20/24] qapi: New qobject_input_visitor_new_str() for convenience |
Date: |
Tue, 28 Feb 2017 22:27:06 +0100 |
Signed-off-by: Markus Armbruster <address@hidden>
---
include/qapi/qobject-input-visitor.h | 12 ++++++++++++
qapi/qobject-input-visitor.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/include/qapi/qobject-input-visitor.h
b/include/qapi/qobject-input-visitor.h
index 282f9d2..b399285 100644
--- a/include/qapi/qobject-input-visitor.h
+++ b/include/qapi/qobject-input-visitor.h
@@ -68,4 +68,16 @@ Visitor *qobject_input_visitor_new(QObject *obj);
*/
Visitor *qobject_input_visitor_new_keyval(QObject *obj);
+/*
+ * Create a QObject input visitor for parsing @str.
+ *
+ * If @str looks like JSON, parse it as JSON, else as KEY=VALUE,...
+ * @implied_key applies to KEY=VALUE, and works as in keyval_parse().
+ * On failure, store an error through @errp and return NULL.
+ * On success, return a new QObject input visitor for the parse.
+ */
+Visitor *qobject_input_visitor_new_str(const char *str,
+ const char *implied_key,
+ Error **errp);
+
#endif
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 6c56040..1a484d5 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -18,9 +18,11 @@
#include "qapi/visitor-impl.h"
#include "qemu/queue.h"
#include "qemu-common.h"
+#include "qapi/qmp/qjson.h"
#include "qapi/qmp/types.h"
#include "qapi/qmp/qerror.h"
#include "qemu/cutils.h"
+#include "qemu/option.h"
typedef struct StackObject {
const char *name; /* Name of @obj in its parent, if any */
@@ -656,3 +658,37 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj)
return &v->visitor;
}
+
+Visitor *qobject_input_visitor_new_str(const char *str,
+ const char *implied_key,
+ Error **errp)
+{
+ bool is_json = str[0] == '{';
+ QObject *obj;
+ QDict *args;
+ Visitor *v;
+
+ if (is_json) {
+ obj = qobject_from_json(str, errp);
+ if (!obj) {
+ /* Work around qobject_from_json() lossage TODO fix that */
+ if (errp && !*errp) {
+ error_setg(errp, "JSON parse error");
+ return NULL;
+ }
+ return NULL;
+ }
+ args = qobject_to_qdict(obj);
+ assert(args);
+ v = qobject_input_visitor_new(QOBJECT(args));
+ } else {
+ args = keyval_parse(str, implied_key, errp);
+ if (!args) {
+ return NULL;
+ }
+ v = qobject_input_visitor_new_keyval(QOBJECT(args));
+ }
+ QDECREF(args);
+
+ return v;
+}
--
2.7.4
- [Qemu-block] [PATCH v2 03/24] keyval: New keyval_parse(), (continued)
- [Qemu-block] [PATCH v2 03/24] keyval: New keyval_parse(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 04/24] qapi: qobject input visitor variant for use with keyval_parse(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 15/24] test-visitor-serialization: Pass &error_abort to qobject_from_json(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 23/24] docs/qapi-code-gen.txt: Clarify naming rules, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 06/24] qapi: Factor out common part of qobject input visitor creation, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 07/24] qapi: Factor out common qobject_input_get_keyval(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 16/24] monitor: Assert qmp_schema_json[] is sane, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 20/24] qapi: New qobject_input_visitor_new_str() for convenience,
Markus Armbruster <=
- [Qemu-block] [PATCH v2 19/24] keyval: Restrict key components to valid QAPI names, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 22/24] qapi: Improve how keyval input visitor reports unexpected dicts, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 05/24] test-keyval: Cover use with qobject input visitor, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 14/24] check-qjson: Test errors from qobject_from_json(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 12/24] qobject: Propagate parse errors through qobject_from_json(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 18/24] qapi: New parse_qapi_name(), Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 17/24] test-qapi-util: New, covering qapi/qapi-util.c, Markus Armbruster, 2017/02/28
- [Qemu-block] [PATCH v2 21/24] block: Initial implementation of -blockdev, Markus Armbruster, 2017/02/28