From bf01601f11454cdf7f26c674893ccbca7c09a1ce Mon Sep 17 00:00:00 2001 From: Adrian Vovk Date: Wed, 3 Jul 2024 17:51:35 -0400 Subject: [PATCH] table: Add TABLE_SET_JSON_FIELD_NAME 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 | 14 ++++++++++++++ src/shared/format-table.h | 1 + src/test/test-format-table.c | 24 +++++++++++++++++++----- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/shared/format-table.c b/src/shared/format-table.c index 14eeb4647f4..e538d964147 100644 --- a/src/shared/format-table.c +++ b/src/shared/format-table.c @@ -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); diff --git a/src/shared/format-table.h b/src/shared/format-table.h index dcd339727f3..15c0547b944 100644 --- a/src/shared/format-table.h +++ b/src/shared/format-table.h @@ -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; diff --git a/src/test/test-format-table.c b/src/test/test-format-table.c index 85cd31ecee5..fa34c29b02c 100644 --- a/src/test/test-format-table.c +++ b/src/test/test-format-table.c @@ -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)); -- 2.47.3