pipewire: properties: introduce pw_properties_move

Add

  pw_properties_move(dst, dst_key, src, src_key, fallback_value)

which can move a key-value pair from one property list into
another, optionally using the fallback value as value if
`src_key` cannot be found in `src`.

Add tests as well.

This commit also adds `pw_properties_rename()`, which can be used
to change the key in a dictionary, but that is not made part of
the public API yet.
This commit is contained in:
Barnabás Pőcze 2021-06-12 16:24:59 +02:00
parent 5459c759ee
commit be18d052ad
3 changed files with 189 additions and 0 deletions

View file

@ -605,6 +605,84 @@ PWTEST(properties_update)
return PWTEST_PASS;
}
PWTEST(properties_move)
{
struct pw_properties *a = pw_properties_new(NULL, NULL),
*b = pw_properties_new(NULL, NULL);
pwtest_ptr_notnull(a);
pwtest_ptr_notnull(b);
pwtest_int_eq(pw_properties_set(a, "some key", "foo"), 1);
pwtest_int_eq(pw_properties_set(a, "some other key", "bar"), 1);
/*
* a = {"some key" : "foo", "some other key" : "bar"}
* b = {}
*/
pwtest_int_eq(pw_properties_move(b, "different key", a, "some key", NULL), 1);
pwtest_str_eq(pw_properties_get(b, "different key"), "foo");
pwtest_str_eq(pw_properties_get(a, "some key"), NULL);
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo"}
*/
pwtest_ptr_null(pw_properties_get(a, "server_address"));
pwtest_int_eq(pw_properties_move(b, "server.address", a, "server_address", NULL), -ENOENT);
pwtest_str_eq(pw_properties_get(b, "server.address"), NULL);
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo"}
*/
pwtest_int_eq(pw_properties_move(b, "server.port", a, "server_port", "4444"), 1);
pwtest_str_eq(pw_properties_get(b, "server.port"), "4444");
pwtest_str_eq(pw_properties_get(a, "server_port"), NULL);
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo", "server.port" : "4444"}
*/
pwtest_int_eq(pw_properties_move(b, "server.port", b, "server.port", NULL), 0);
pwtest_str_eq(pw_properties_get(b, "server.port"), "4444");
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo", "server.port" : "4444"}
*/
pwtest_int_eq(pw_properties_move(b, "server_port", b, "server.port", NULL), 1);
pwtest_str_eq(pw_properties_get(b, "server_port"), "4444");
pwtest_str_eq(pw_properties_get(b, "server.port"), NULL);
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo", "server_port" : "4444"}
*/
pwtest_int_eq(pw_properties_move(b, "server_port", a, "server_port", "9999"), 1);
pwtest_str_eq(pw_properties_get(b, "server_port"), "9999");
/*
* a = {"some other key" : "bar"}
* b = {"different key" : "foo", "server_port" : "9999"}
*/
pwtest_int_eq(pw_properties_move(b, "server_port", b, "server.port", "8888"), 1);
pwtest_str_eq(pw_properties_get(b, "server_port"), "8888");
pwtest_str_eq(pw_properties_get(b, "server.port"), NULL);
pw_properties_free(a);
pw_properties_free(b);
return PWTEST_PASS;
}
PWTEST_SUITE(properties)
{
pwtest_add(properties_abi, PWTEST_NOARG);
@ -624,6 +702,7 @@ PWTEST_SUITE(properties)
pwtest_add(properties_new_dict, PWTEST_NOARG);
pwtest_add(properties_new_json, PWTEST_NOARG);
pwtest_add(properties_update, PWTEST_NOARG);
pwtest_add(properties_move, PWTEST_NOARG);
return PWTEST_PASS;
}