From: Lennart Poettering Date: Thu, 20 Jun 2024 07:24:18 +0000 (+0200) Subject: json: make it easy to serialize our enums to json X-Git-Tag: v257-rc1~1084^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a556a71e9c26e0ba65c634b494b312e5584adf5e;p=thirdparty%2Fsystemd.git json: make it easy to serialize our enums to json Most of our enums are mapped to strings that use dashes ("-") as word separators, i.e. "foo-bar-baz". However, Varlink enums do not allow "-" as separator, see: https://varlink.org/Interface-Definition Hence, let's add some simple glue to automatucally turn "-" into "_" for use when serializing our enums. --- diff --git a/src/libsystemd/sd-json/json-util.h b/src/libsystemd/sd-json/json-util.h index 0b48158a4cc..2b5ef521b6b 100644 --- a/src/libsystemd/sd-json/json-util.h +++ b/src/libsystemd/sd-json/json-util.h @@ -130,6 +130,7 @@ enum { _JSON_BUILD_IOVEC_HEX, _JSON_BUILD_HW_ADDR, _JSON_BUILD_STRING_SET, + _JSON_BUILD_STRING_UNDERSCORIFY, _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, _JSON_BUILD_PAIR_FINITE_USEC, @@ -156,6 +157,7 @@ enum { #define JSON_BUILD_ETHER_ADDR(v) SD_JSON_BUILD_BYTE_ARRAY(((const struct ether_addr*) { v })->ether_addr_octet, sizeof(struct ether_addr)) #define JSON_BUILD_HW_ADDR(v) _JSON_BUILD_HW_ADDR, (const struct hw_addr_data*) { v } #define JSON_BUILD_STRING_SET(s) _JSON_BUILD_STRING_SET, (Set *) { s } +#define JSON_BUILD_STRING_UNDERSCORIFY(s) _JSON_BUILD_STRING_UNDERSCORIFY, (const char *) { s } #define JSON_BUILD_PAIR_UNSIGNED_NON_ZERO(name, u) _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, (const char*) { name }, (uint64_t) { u } #define JSON_BUILD_PAIR_FINITE_USEC(name, u) _JSON_BUILD_PAIR_FINITE_USEC, (const char*) { name }, (usec_t) { u } diff --git a/src/libsystemd/sd-json/sd-json.c b/src/libsystemd/sd-json/sd-json.c index 5f9c5932059..e092dcdbaee 100644 --- a/src/libsystemd/sd-json/sd-json.c +++ b/src/libsystemd/sd-json/sd-json.c @@ -3500,7 +3500,8 @@ _public_ int sd_json_buildv(sd_json_variant **ret, va_list ap) { switch (command) { - case _SD_JSON_BUILD_STRING: { + case _SD_JSON_BUILD_STRING: + case _JSON_BUILD_STRING_UNDERSCORIFY: { const char *p; if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) { @@ -3511,6 +3512,18 @@ _public_ int sd_json_buildv(sd_json_variant **ret, va_list ap) { p = va_arg(ap, const char *); if (current->n_suppress == 0) { + _cleanup_free_ char *c = NULL; + + if (command == _JSON_BUILD_STRING_UNDERSCORIFY) { + c = strreplace(p, "-", "_"); + if (!c) { + r = -ENOMEM; + goto finish; + } + + p = c; + } + r = sd_json_variant_new_string(&add, p); if (r < 0) goto finish; diff --git a/src/test/test-json.c b/src/test/test-json.c index 69fb0859c7b..5ebb5dd4a0c 100644 --- a/src/test/test-json.c +++ b/src/test/test-json.c @@ -306,13 +306,17 @@ TEST(build) { a = sd_json_variant_unref(a); b = sd_json_variant_unref(b); - assert_se(sd_json_build(&a, SD_JSON_BUILD_OBJECT(SD_JSON_BUILD_PAIR("one", SD_JSON_BUILD_INTEGER(7)), - SD_JSON_BUILD_PAIR("two", SD_JSON_BUILD_REAL(2.0)), - SD_JSON_BUILD_PAIR("three", SD_JSON_BUILD_INTEGER(0)))) >= 0); - - assert_se(sd_json_build(&b, SD_JSON_BUILD_OBJECT(SD_JSON_BUILD_PAIR("two", SD_JSON_BUILD_INTEGER(2)), - SD_JSON_BUILD_PAIR("three", SD_JSON_BUILD_REAL(0)), - SD_JSON_BUILD_PAIR("one", SD_JSON_BUILD_REAL(7)))) >= 0); + assert_se(sd_json_buildo(&a, + SD_JSON_BUILD_PAIR("one", SD_JSON_BUILD_INTEGER(7)), + SD_JSON_BUILD_PAIR("two", SD_JSON_BUILD_REAL(2.0)), + SD_JSON_BUILD_PAIR("four", JSON_BUILD_STRING_UNDERSCORIFY("foo-bar-baz")), + SD_JSON_BUILD_PAIR("three", SD_JSON_BUILD_INTEGER(0))) >= 0); + + assert_se(sd_json_buildo(&b, + SD_JSON_BUILD_PAIR("two", SD_JSON_BUILD_INTEGER(2)), + SD_JSON_BUILD_PAIR("four", SD_JSON_BUILD_STRING("foo_bar_baz")), + SD_JSON_BUILD_PAIR("three", SD_JSON_BUILD_REAL(0)), + SD_JSON_BUILD_PAIR("one", SD_JSON_BUILD_REAL(7))) >= 0); assert_se(sd_json_variant_equal(a, b));