]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: make it easy to serialize our enums to json
authorLennart Poettering <lennart@poettering.net>
Thu, 20 Jun 2024 07:24:18 +0000 (09:24 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 20 Jun 2024 16:25:11 +0000 (18:25 +0200)
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.

src/libsystemd/sd-json/json-util.h
src/libsystemd/sd-json/sd-json.c
src/test/test-json.c

index 0b48158a4cc1546eb36bb448206ea14638350eb9..2b5ef521b6bd384ce6a333769eb1ccc2e72b2d10 100644 (file)
@@ -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 }
index 5f9c59320594f086a8fc07e33429363a1a76ade8..e092dcdbaeea7bc80bdff2b03a5dd7f2ddf85e44 100644 (file)
@@ -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;
index 69fb0859c7bbb53d831246af3f955e44910901e8..5ebb5dd4a0cdeae2b96e8600beb3d351f5944d06 100644 (file)
@@ -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));