From: Lennart Poettering Date: Tue, 1 Nov 2022 13:56:44 +0000 (+0100) Subject: json: add helper for adding variant to array suppressing duplicates X-Git-Tag: v253-rc1~273^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3bb326c558c33402923e081332170e574ed56c3f;p=thirdparty%2Fsystemd.git json: add helper for adding variant to array suppressing duplicates --- diff --git a/src/shared/json.c b/src/shared/json.c index b1ef0ed3499..fd54835efa3 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -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; diff --git a/src/shared/json.h b/src/shared/json.h index 8d060e78777..5d79472351f 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -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); diff --git a/src/test/test-json.c b/src/test/test-json.c index 7ff9c560dd3..0f5c5b1a6e8 100644 --- a/src/test/test-json.c +++ b/src/test/test-json.c @@ -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);