Message ID | 20190108123311.24456-1-anthony.perard@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qmp-shell: Fix example with objects as values | expand |
On 1/8/19 7:33 AM, Anthony PERARD wrote: > The example shown that is suppose to let a user passes an object/array as > argument doesn't work. The quotes get removed by shlex.split() and then > both JSON parser complains. Fix the example by adding quotes and add > examples with boolean and array. > > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > --- > scripts/qmp/qmp-shell | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell > index 770140772d..9937e3c888 100755 > --- a/scripts/qmp/qmp-shell > +++ b/scripts/qmp/qmp-shell > @@ -33,7 +33,11 @@ > # key=value pairs also support Python or JSON object literal subset notations, > # without spaces. Dictionaries/objects {} are supported as are arrays []. > # > -# example-command arg-name1={'key':'value','obj'={'prop':"value"}} Yes, I can replicate that with a command such as: (QEMU) object-add qom-type="rng-random" id="rng1" props={"filename": "/dev/hwrng"} That results in: Error while parsing command line: Expected a key=value pair, got '/dev/hwrng}' command format: <command-name> [arg-name1=arg1] ... [arg-nameN=argN] > +# JSON: > +# example-command arg-name1='{"key":"value","obj":{"prop":"value"}}' > +# example-command arg-name1='{"key":"value","obj":[1,true,"three"]}' The usage fix is to have the dictionary quoted, indeed: (QEMU) object-add qom-type="rng-random" id="rng4" props="{'filename': '/dev/hwrng'}" {"return": {}} > +# free style: > +# example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}" I just find the "free style" confusing... IMO how to be more creative about escaping is optional, and adds noise to the most common use case. Thanks, - Cleber. > # > # Both JSON and Python formatting should work, including both styles of > # string literal quotes. Both paradigms of literal values should work, >
On Fri, Jan 11, 2019 at 09:37:47AM -0500, Cleber Rosa wrote: > > > On 1/8/19 7:33 AM, Anthony PERARD wrote: > > The example shown that is suppose to let a user passes an object/array as > > argument doesn't work. The quotes get removed by shlex.split() and then > > both JSON parser complains. Fix the example by adding quotes and add > > examples with boolean and array. > > > > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > > --- > > scripts/qmp/qmp-shell | 6 +++++- > > 1 file changed, 5 insertions(+), 1 deletion(-) > > > > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell > > index 770140772d..9937e3c888 100755 > > --- a/scripts/qmp/qmp-shell > > +++ b/scripts/qmp/qmp-shell > > @@ -33,7 +33,11 @@ > > # key=value pairs also support Python or JSON object literal subset notations, > > # without spaces. Dictionaries/objects {} are supported as are arrays []. The "without spaces" part is outdated. Now we do support spaces as long as the argument is quoted. > > # > > -# example-command arg-name1={'key':'value','obj'={'prop':"value"}} > > Yes, I can replicate that with a command such as: > > (QEMU) object-add qom-type="rng-random" id="rng1" props={"filename": > "/dev/hwrng"} > > That results in: > > Error while parsing command line: Expected a key=value pair, got > '/dev/hwrng}' > command format: <command-name> [arg-name1=arg1] ... [arg-nameN=argN] The example has no spaces, and you seem to have a whitespace before "/dev/rng" above. The problem here is that this worked before started using shlex. qmp-shell from QEMU 3.0 worked: (QEMU) object-add qom-type=rng-random id="rng1" props={"filename":"/dev/hwrng"} {"return": {}} Now we get this: (QEMU) object-add qom-type=rng-random id="rng1" props={"filename":"/dev/hwrng"} {"error": {"class": "GenericError", "desc": "Invalid parameter type for 'props', expected: dict"}} This means we lost the ability to write JSON without any extra quotes to gain the ability to have arguments with spaces. How hard it would be to fix that? > > > +# JSON: > > +# example-command arg-name1='{"key":"value","obj":{"prop":"value"}}' > > +# example-command arg-name1='{"key":"value","obj":[1,true,"three"]}' > > The usage fix is to have the dictionary quoted, indeed: > > (QEMU) object-add qom-type="rng-random" id="rng4" props="{'filename': > '/dev/hwrng'}" > {"return": {}} > > > +# free style: > > +# example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}" > I just find the "free style" confusing... IMO how to be more creative > about escaping is optional, and adds noise to the most common use case. The example seems to be a simple demonstration of how escaping works, but maybe we shouldn't encourage people to try weird tricks with escaping. Especially if we want to eventually make unquoted JSON data work again.
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell index 770140772d..9937e3c888 100755 --- a/scripts/qmp/qmp-shell +++ b/scripts/qmp/qmp-shell @@ -33,7 +33,11 @@ # key=value pairs also support Python or JSON object literal subset notations, # without spaces. Dictionaries/objects {} are supported as are arrays []. # -# example-command arg-name1={'key':'value','obj'={'prop':"value"}} +# JSON: +# example-command arg-name1='{"key":"value","obj":{"prop":"value"}}' +# example-command arg-name1='{"key":"value","obj":[1,true,"three"]}' +# free style: +# example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}" # # Both JSON and Python formatting should work, including both styles of # string literal quotes. Both paradigms of literal values should work,
The example shown that is suppose to let a user passes an object/array as argument doesn't work. The quotes get removed by shlex.split() and then both JSON parser complains. Fix the example by adding quotes and add examples with boolean and array. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- scripts/qmp/qmp-shell | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)