json: add helper for adding variant to array suppressing duplicates

This commit is contained in:
Lennart Poettering
2022-12-15 11:39:57 +01:00
parent c68523e00d
commit 3bb326c558
3 changed files with 49 additions and 1 deletions
+21 -1
View 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;
+3
View 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);
+25
View 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);