On 04/06/18 20:10, Eric Blake wrote: > On 04/06/2018 12:28 PM, Laszlo Ersek wrote: > >> I've created an RFC-level "qapi/firmware.json" schema file, based on >> this discussion. It "builds", and the generated documentation looks >> acceptable, superficially speaking. >> >> Before I post "qapi/firmware.json" for getting comments, I'd like to >> write JSON text that (a) describes firmware that I use, and (b) >> conforms to the schema. IOW, I'd like to validate whether the schema >> is good enough for describing at least such firmware that I know. >> >> Is there a tool that generates example JSON objects from a given >> schema? > > I know the QMP shell (scripts/qmp/qmp-shell) lets you enter commands > with a lot less typing than full JSON, and has a mode where it will > then echo the full JSON command it constructed from what you typed. To > be able to quickly validate examples, it may be sufficient to > temporarily add a new QMP command 'check-firmware': > > { 'command': 'check-firmware', 'boxed': true, 'data': 'Firmware' } > > assuming 'Firmware' is your top-level 'struct' in the QAPI file, then > implement a trivial: > > qmp_check_firmware(Firmware *obj, Error **errp) { > return 0; > } > > so that you can then run QMP shell, and type: > > check-firmware arg1=foo arg2=bar ... > > which will then generate the corresponding JSON, then either > successfully do nothing (what you typed validated, AND you have the > JSON output printed), or print an error (what you typed failed QAPI > validation, perhaps because it had an unrecognized key, was missing a > required key, used a wrong type, etc). > >> I vaguely recall there used to be one. Otherwise, writing the >> examples manually looks arduous (and I wouldn't know how to verify >> them against the schema). > > Similarly, if you generate a command the produces a 'Firmware' as the > return value, then you can populate the generated C struct (since you > did manage to run the QAPI generator over your new file, you should be > able to look at the C struct it generated), then output that over QMP > to show the counterpart JSON that matches the struct as populated. > The top level structure is complex / nested, but that doesn't appear to be an issue. According to the script, # 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"}} # # Both JSON and Python formatting should work, including both styles of # string literal quotes. Both paradigms of literal values should work, # including null/true/false for JSON and None/True/False for Python. This looks awesome, because it should let me provide messy nested input (which I'll obviously compose in my $EDITOR and then paste it), and then the QMP shell will both validate and pretty print that. I'm going to try this. Thank you, Eric! Laszlo -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list