]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
table: Add TABLE_SET_JSON_FIELD_NAME
authorAdrian Vovk <adrianvovk@gmail.com>
Wed, 3 Jul 2024 21:51:35 +0000 (17:51 -0400)
committerAdrian Vovk <adrianvovk@gmail.com>
Wed, 17 Jul 2024 18:15:41 +0000 (14:15 -0400)
Lets you conveniently set JSON field names in table_add_many. Especially
useful for vertical tables. For example:

table_add_many(t,
               TABLE_FIELD, "Display Name",
               TABLE_STRING, obj->display_name,
               TABLE_SET_JSON_FIELD_NAME, "displayName",
               TABLE_FIELD, "Timestamp",
               TABLE_TIMESTAMP, obj->timestamp,
               TABLE_SET_JSON_FIELD_NAME, "timestampUSec");

src/shared/format-table.c
src/shared/format-table.h
src/test/test-format-table.c

index 14eeb4647f4e03d9be12a436312963419c37791a..e538d9641470f0e181c334cf64931b5c891bd60b 100644 (file)
@@ -1184,6 +1184,20 @@ int table_add_many_internal(Table *t, TableDataType first_type, ...) {
                         goto check;
                 }
 
+                case TABLE_SET_JSON_FIELD_NAME: {
+                        const char *n = va_arg(ap, const char*);
+                        size_t idx;
+                        if (t->vertical) {
+                                assert(TABLE_CELL_TO_INDEX(last_cell) >= t->n_columns);
+                                idx = TABLE_CELL_TO_INDEX(last_cell) / t->n_columns - 1;
+                        } else {
+                                idx = TABLE_CELL_TO_INDEX(last_cell);
+                                assert(idx < t->n_columns);
+                        }
+                        r = table_set_json_field_name(t, idx, n);
+                        goto check;
+                }
+
                 case _TABLE_DATA_TYPE_MAX:
                         /* Used as end marker */
                         va_end(ap);
index dcd339727f3cdb912ece03a7251c1be442fa12b9..15c0547b944f0f814a708d68f89b6adb5ccefeec 100644 (file)
@@ -74,6 +74,7 @@ typedef enum TableDataType {
         TABLE_SET_BOTH_UNDERLINES,
         TABLE_SET_URL,
         TABLE_SET_UPPERCASE,
+        TABLE_SET_JSON_FIELD_NAME,
 
         _TABLE_DATA_TYPE_INVALID = -EINVAL,
 } TableDataType;
index 85cd31ecee5de6af90fe826cdeeaf430779f5c0f..fa34c29b02c817747825d13e969bc3005e9df593 100644 (file)
@@ -364,18 +364,27 @@ TEST(json) {
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL, *w = NULL;
         _cleanup_(table_unrefp) Table *t = NULL;
 
-        assert_se(t = table_new("foo bar", "quux", "piep miau"));
+        assert_se(t = table_new_raw(4));
+
+        assert_se(table_add_many(t,
+                                 TABLE_HEADER, "foo bar",
+                                 TABLE_HEADER, "quux",
+                                 TABLE_HEADER, "piep miau",
+                                 TABLE_HEADER, "asdf",
+                                 TABLE_SET_JSON_FIELD_NAME, "asdf-custom") >= 0);
         assert_se(table_set_json_field_name(t, 2, "zzz") >= 0);
 
         assert_se(table_add_many(t,
                                  TABLE_STRING, "v1",
                                  TABLE_UINT64, UINT64_C(4711),
-                                 TABLE_BOOLEAN, true) >= 0);
+                                 TABLE_BOOLEAN, true,
+                                 TABLE_EMPTY) >= 0);
 
         assert_se(table_add_many(t,
                                  TABLE_STRV, STRV_MAKE("a", "b", "c"),
                                  TABLE_EMPTY,
-                                 TABLE_MODE, 0755) >= 0);
+                                 TABLE_MODE, 0755,
+                                 TABLE_EMPTY) >= 0);
 
         assert_se(table_to_json(t, &v) >= 0);
 
@@ -384,11 +393,13 @@ TEST(json) {
                                              SD_JSON_BUILD_OBJECT(
                                                              SD_JSON_BUILD_PAIR("foo_bar", JSON_BUILD_CONST_STRING("v1")),
                                                              SD_JSON_BUILD_PAIR("quux", SD_JSON_BUILD_UNSIGNED(4711)),
-                                                             SD_JSON_BUILD_PAIR("zzz", SD_JSON_BUILD_BOOLEAN(true))),
+                                                             SD_JSON_BUILD_PAIR("zzz", SD_JSON_BUILD_BOOLEAN(true)),
+                                                             SD_JSON_BUILD_PAIR("asdf-custom", SD_JSON_BUILD_NULL)),
                                              SD_JSON_BUILD_OBJECT(
                                                              SD_JSON_BUILD_PAIR("foo_bar", SD_JSON_BUILD_STRV(STRV_MAKE("a", "b", "c"))),
                                                              SD_JSON_BUILD_PAIR("quux", SD_JSON_BUILD_NULL),
-                                                             SD_JSON_BUILD_PAIR("zzz", SD_JSON_BUILD_UNSIGNED(0755))))) >= 0);
+                                                             SD_JSON_BUILD_PAIR("zzz", SD_JSON_BUILD_UNSIGNED(0755)),
+                                                             SD_JSON_BUILD_PAIR("asdf-custom", SD_JSON_BUILD_NULL)))) >= 0);
 
         assert_se(sd_json_variant_equal(v, w));
 }
@@ -544,6 +555,7 @@ TEST(vertical) {
         assert_se(table_add_many(t,
                                  TABLE_FIELD, "pfft aa", TABLE_STRING, "foo",
                                  TABLE_FIELD, "uuu o", TABLE_SIZE, UINT64_C(1024),
+                                 TABLE_FIELD, "quux", TABLE_STRING, "asdf", TABLE_SET_JSON_FIELD_NAME, "custom-quux",
                                  TABLE_FIELD, "lllllllllllo", TABLE_STRING, "jjjjjjjjjjjjjjjjj") >= 0);
 
         assert_se(table_set_json_field_name(t, 1, "dimpfelmoser") >= 0);
@@ -553,6 +565,7 @@ TEST(vertical) {
         assert_se(streq(formatted,
                         "     pfft aa: foo\n"
                         "       uuu o: 1K\n"
+                        "        quux: asdf\n"
                         "lllllllllllo: jjjjjjjjjjjjjjjjj\n"));
 
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *a = NULL, *b = NULL;
@@ -561,6 +574,7 @@ TEST(vertical) {
         assert_se(sd_json_build(&b, SD_JSON_BUILD_OBJECT(
                                              SD_JSON_BUILD_PAIR("pfft_aa", SD_JSON_BUILD_STRING("foo")),
                                              SD_JSON_BUILD_PAIR("dimpfelmoser", SD_JSON_BUILD_UNSIGNED(1024)),
+                                             SD_JSON_BUILD_PAIR("custom-quux", SD_JSON_BUILD_STRING("asdf")),
                                              SD_JSON_BUILD_PAIR("lllllllllllo", SD_JSON_BUILD_STRING("jjjjjjjjjjjjjjjjj")))) >= 0);
 
         assert_se(sd_json_variant_equal(a, b));