This helper eases iterating all key=value pairs stored in a JSON
object. Usually we pick only certain known keys from a JSON object, but
this will allow to walk complete objects and have the callback act on
those.
---

Notes:
    Version 2:-
    - fixed typo in commit message
    - ACKed by Eric

 src/libvirt_private.syms |  1 +
 src/util/virjson.c       | 33 +++++++++++++++++++++++++++++++++
 src/util/virjson.h       |  8 ++++++++
 3 files changed, 42 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ab32eaa..cf5ccaf 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1550,6 +1550,7 @@ virJSONValueObjectAppendNumberUlong;
 virJSONValueObjectAppendString;
 virJSONValueObjectCreate;
 virJSONValueObjectCreateVArgs;
+virJSONValueObjectForeachKeyValue;
 virJSONValueObjectGet;
 virJSONValueObjectGetBoolean;
 virJSONValueObjectGetKey;
diff --git a/src/util/virjson.c b/src/util/virjson.c
index 1bb2653..c8d761f 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -1200,6 +1200,39 @@ virJSONValueObjectIsNull(virJSONValuePtr object,
 }


+/**
+ * virJSONValueObjectForeachKeyValue:
+ * @object: JSON object to iterate
+ * @cb: callback to call on key-value pairs contained in the object
+ * @opaque: generic data for the callback
+ *
+ * Iterates all key=value pairs in @object. Iteration breaks if @cb returns
+ * negative value.
+ *
+ * Returns 0 if all elements were iterated, -2 if @cb returned negative value
+ * during iteration and -1 on generic errors.
+ */
+int
+virJSONValueObjectForeachKeyValue(virJSONValuePtr object,
+                                  virJSONValueObjectIteratorFunc cb,
+                                  void *opaque)
+{
+    size_t i;
+
+    if (object->type != VIR_JSON_TYPE_OBJECT)
+        return -1;
+
+    for (i = 0; i < object->data.object.npairs; i++) {
+        virJSONObjectPairPtr elem = object->data.object.pairs + i;
+
+        if (cb(elem->key, elem->value, opaque) < 0)
+            return -2;
+    }
+
+    return 0;
+}
+
+
 #if WITH_YAJL
 static int
 virJSONParserInsertValue(virJSONParserPtr parser,
diff --git a/src/util/virjson.h b/src/util/virjson.h
index 57010b0..9bb7461 100644
--- a/src/util/virjson.h
+++ b/src/util/virjson.h
@@ -157,4 +157,12 @@ virJSONValuePtr virJSONValueFromString(const char 
*jsonstring);
 char *virJSONValueToString(virJSONValuePtr object,
                            bool pretty);

+typedef int (*virJSONValueObjectIteratorFunc)(const char *key,
+                                              const virJSONValue *value,
+                                              void *opaque);
+
+int virJSONValueObjectForeachKeyValue(virJSONValuePtr object,
+                                      virJSONValueObjectIteratorFunc cb,
+                                      void *opaque);
+
 #endif /* __VIR_JSON_H_ */
-- 
2.2.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to