From: Peter Krempa <[email protected]>

Add a helper which replaces the value part of a JSON object key. This
will be helpful in tests where we'll want to rewrite some outputs (e.g.
fds) to stabilize output files.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/libvirt_private.syms |  1 +
 src/util/virjson.c       | 24 ++++++++++++++++++++++++
 src/util/virjson.h       |  6 ++++++
 3 files changed, 31 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 50fe3a9218..4816dff6dd 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2772,6 +2772,7 @@ virJSONValueObjectHasKey;
 virJSONValueObjectKeysNumber;
 virJSONValueObjectPrependString;
 virJSONValueObjectRemoveKey;
+virJSONValueObjectReplaceKey;
 virJSONValueObjectStealArray;
 virJSONValueObjectStealObject;
 virJSONValueToBuffer;
diff --git a/src/util/virjson.c b/src/util/virjson.c
index b751326154..403b86101d 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -905,6 +905,30 @@ virJSONValueObjectRemoveKey(virJSONValue *object,
 }


+/* Replace value for key-value pair @key.
+ * Returns 1 on success, 0 if no key was found, and -1 on error.  */
+int
+virJSONValueObjectReplaceKey(virJSONValue *object,
+                             const char *key,
+                             virJSONValue **newvalue)
+{
+    size_t i;
+
+    if (object->type != VIR_JSON_TYPE_OBJECT)
+        return -1;
+
+    for (i = 0; i < object->data.object.npairs; i++) {
+        if (STREQ(object->data.object.pairs[i].key, key)) {
+            virJSONValueFree(object->data.object.pairs[i].value);
+            object->data.object.pairs[i].value = g_steal_pointer(newvalue);
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+
 virJSONValue *
 virJSONValueObjectGetValue(virJSONValue *object,
                            unsigned int n)
diff --git a/src/util/virjson.h b/src/util/virjson.h
index d8481e5890..a184dd104f 100644
--- a/src/util/virjson.h
+++ b/src/util/virjson.h
@@ -241,6 +241,12 @@ virJSONValueObjectRemoveKey(virJSONValue *object,
                             virJSONValue **value)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

+int
+virJSONValueObjectReplaceKey(virJSONValue *object,
+                             const char *key,
+                             virJSONValue **value)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+
 int
 virJSONValueArrayAppendString(virJSONValue *object,
                               const char *value);
-- 
2.54.0

Reply via email to