mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
qapi: New qobject_input_visitor_new_str() for convenience
Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1488317230-26248-21-git-send-email-armbru@redhat.com>
This commit is contained in:
parent
f740048323
commit
9d1eab4b95
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user