qemu/include/qapi
Daniel P. Berrange 603476c25c qdict: implement a qdict_crumple method for un-flattening a dict
The qdict_flatten() method will take a dict whose elements are
further nested dicts/lists and flatten them by concatenating
keys.

The qdict_crumple() method aims to do the reverse, taking a flat
qdict, and turning it into a set of nested dicts/lists. It will
apply nesting based on the key name, with a '.' indicating a
new level in the hierarchy. If the keys in the nested structure
are all numeric, it will create a list, otherwise it will create
a dict.

If the keys are a mixture of numeric and non-numeric, or the
numeric keys are not in strictly ascending order, an error will
be reported.

As an example, a flat dict containing

 {
   'foo.0.bar': 'one',
   'foo.0.wizz': '1',
   'foo.1.bar': 'two',
   'foo.1.wizz': '2'
 }

will get turned into a dict with one element 'foo' whose
value is a list. The list elements will each in turn be
dicts.

 {
   'foo': [
     { 'bar': 'one', 'wizz': '1' },
     { 'bar': 'two', 'wizz': '2' }
   ],
 }

If the key is intended to contain a literal '.', then it must
be escaped as '..'. ie a flat dict

  {
     'foo..bar': 'wizz',
     'bar.foo..bar': 'eek',
     'bar.hello': 'world'
  }

Will end up as

  {
     'foo.bar': 'wizz',
     'bar': {
        'foo.bar': 'eek',
        'hello': 'world'
     }
  }

The intent of this function is that it allows a set of QemuOpts
to be turned into a nested data structure that mirrors the nesting
used when the same object is defined over QMP.

Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1475246744-29302-3-git-send-email-berrange@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Parameter recursive dropped along with its tests; whitespace style
touched up]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2016-10-25 17:56:14 +02:00
..
qmp qdict: implement a qdict_crumple method for un-flattening a dict 2016-10-25 17:56:14 +02:00
clone-visitor.h sockets: Use new QAPI cloning 2016-07-06 10:52:04 +02:00
dealloc-visitor.h qapi: Add new visit_free() function 2016-07-06 10:52:04 +02:00
error.h migration: add reporting of errors for outgoing migration 2016-05-26 11:31:30 +05:30
opts-visitor.h opts-visitor: Favor new visit_free() function 2016-07-06 10:52:04 +02:00
qmp-event.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qobject-input-visitor.h qapi: rename QmpInputVisitor to QObjectInputVisitor 2016-10-25 16:25:54 +02:00
qobject-output-visitor.h qapi: rename QmpOutputVisitor to QObjectOutputVisitor 2016-10-25 16:25:54 +02:00
string-input-visitor.h string-input-visitor: Favor new visit_free() function 2016-07-06 10:52:04 +02:00
string-output-visitor.h qapi: Add new visit_complete() function 2016-07-06 10:52:04 +02:00
util.h qom: Make enum string tables const-correct 2015-06-19 18:42:18 +02:00
visitor-impl.h qapi: Add new clone visitor 2016-07-06 10:52:04 +02:00
visitor.h qapi: rename *qmp-*-visitor* to *qobject-*-visitor* 2016-10-25 16:25:48 +02:00