]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add helper for adding variant to array suppressing duplicates
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Nov 2022 13:56:44 +0000 (14:56 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 15 Dec 2022 10:39:57 +0000 (11:39 +0100)
src/shared/json.c
src/shared/json.h
src/test/test-json.c

index b1ef0ed34992def5bbbae23b68e02317023c9055..fd54835efa3f834f91d143dd7f0f91868828b4c4 100644 (file)
@@ -2093,7 +2093,6 @@ int json_variant_append_array(JsonVariant **v, JsonVariant *element) {
         assert(v);
         assert(element);
 
-
         if (!*v || json_variant_is_null(*v))
                 blank = true;
         else if (json_variant_is_array(*v))
@@ -2151,6 +2150,27 @@ int json_variant_append_array(JsonVariant **v, JsonVariant *element) {
         return 0;
 }
 
+JsonVariant *json_variant_find(JsonVariant *haystack, JsonVariant *needle) {
+        JsonVariant *i;
+
+        /* Find a json object in an array. Returns NULL if not found, or if the array is not actually an array. */
+
+        JSON_VARIANT_ARRAY_FOREACH(i, haystack)
+                if (json_variant_equal(i, needle))
+                        return i;
+
+        return NULL;
+}
+
+int json_variant_append_array_nodup(JsonVariant **v, JsonVariant *element) {
+        assert(v);
+
+        if (json_variant_find(*v, element))
+                return 0;
+
+        return json_variant_append_array(v, element);
+}
+
 int json_variant_strv(JsonVariant *v, char ***ret) {
         char **l = NULL;
         bool sensitive;
index 8d060e78777de8fa97145435a16a84047b460b8c..5d79472351fa3c1dbab419e4a1350b67d34e2817 100644 (file)
@@ -210,7 +210,10 @@ int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uint64_t
 int json_variant_set_field_boolean(JsonVariant **v, const char *field, bool b);
 int json_variant_set_field_strv(JsonVariant **v, const char *field, char **l);
 
+JsonVariant *json_variant_find(JsonVariant *haystack, JsonVariant *needle);
+
 int json_variant_append_array(JsonVariant **v, JsonVariant *element);
+int json_variant_append_array_nodup(JsonVariant **v, JsonVariant *element);
 
 int json_variant_merge(JsonVariant **v, JsonVariant *m);
 
index 7ff9c560dd34c802011b9a516df4f9004041dc2d..0f5c5b1a6e87e48248a12e16149ebffd4970c9e7 100644 (file)
@@ -726,4 +726,29 @@ TEST(json_array_append_without_source) {
         json_array_append_with_source_one(false);
 }
 
+TEST(json_array_append_nodup) {
+        _cleanup_(json_variant_unrefp) JsonVariant *l = NULL, *s = NULL, *wd = NULL, *nd = NULL;
+
+        assert_se(json_build(&l, JSON_BUILD_STRV(STRV_MAKE("foo", "bar", "baz", "bar", "baz", "foo", "qux", "baz"))) >= 0);
+        assert_se(json_build(&s, JSON_BUILD_STRV(STRV_MAKE("foo", "bar", "baz", "qux"))) >= 0);
+
+        assert_se(!json_variant_equal(l, s));
+        assert_se(json_variant_elements(l) == 8);
+        assert_se(json_variant_elements(s) == 4);
+
+        JsonVariant *i;
+        JSON_VARIANT_ARRAY_FOREACH(i, l) {
+                assert_se(json_variant_append_array(&wd, i) >= 0);
+                assert_se(json_variant_append_array_nodup(&nd, i) >= 0);
+        }
+
+        assert_se(json_variant_elements(wd) == 8);
+        assert_se(json_variant_equal(l, wd));
+        assert_se(!json_variant_equal(s, wd));
+
+        assert_se(json_variant_elements(nd) == 4);
+        assert_se(!json_variant_equal(l, nd));
+        assert_se(json_variant_equal(s, nd));
+}
+
 DEFINE_TEST_MAIN(LOG_DEBUG);