sd-varlink: Add SD_VARLINK_ANY

This allows representing fields that can be either an integer or
a string, like the "value" field we'll be adding in
https://github.com/systemd/systemd/pull/39202.

Upstream spec change: https://github.com/varlink/varlink.github.io/pull/43
This commit is contained in:
Daan De Meyer
2025-11-26 12:55:18 +01:00
committed by Zbigniew Jędrzejewski-Szmek
parent 3a5b37e162
commit 2e51ed7fcb
3 changed files with 23 additions and 1 deletions

View File

@@ -265,6 +265,12 @@ static int varlink_idl_format_field(
fputs(colors[COLOR_RESET], f);
break;
case SD_VARLINK_ANY:
fputs(colors[COLOR_FIELD_TYPE], f);
fputs("any", f);
fputs(colors[COLOR_RESET], f);
break;
case SD_VARLINK_NAMED_TYPE:
fputs(colors[COLOR_IDENTIFIER], f);
fputs(ASSERT_PTR(field->named_type), f);
@@ -867,6 +873,9 @@ static int varlink_idl_subparse_field_type(
} else if (startswith(*p, "object")) {
l = 6;
field->field_type = SD_VARLINK_OBJECT;
} else if (startswith(*p, "any")) {
l = 3;
field->field_type = SD_VARLINK_ANY;
} else if (**p == '(') {
_cleanup_(varlink_symbol_freep) sd_varlink_symbol *symbol = NULL;
size_t n_fields = 0;
@@ -1426,7 +1435,7 @@ bool varlink_idl_symbol_name_is_valid(const char *name) {
/* We might want to reference VARLINK_STRUCT_TYPE and VARLINK_ENUM_TYPE symbols where we also
* reference native types, hence make sure the native type names are refused as symbol names. */
if (STR_IN_SET(name, "bool", "int", "float", "string", "object"))
if (STR_IN_SET(name, "bool", "int", "float", "string", "object", "any"))
return false;
/* Symbols must be named with an uppercase letter as first character */
@@ -1754,6 +1763,10 @@ static int varlink_idl_validate_field_element_type(const sd_varlink_field *field
break;
case SD_VARLINK_ANY:
/* The any type accepts any JSON value, no validation needed */
break;
case _SD_VARLINK_FIELD_COMMENT:
break;

View File

@@ -67,6 +67,7 @@ __extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_field_type_t) {
SD_VARLINK_FLOAT,
SD_VARLINK_STRING,
SD_VARLINK_OBJECT,
SD_VARLINK_ANY,
SD_VARLINK_ENUM_VALUE,
_SD_VARLINK_FIELD_COMMENT, /* Not really a field, just a comment about a field */
_SD_VARLINK_FIELD_TYPE_MAX,

View File

@@ -102,6 +102,13 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(ooom, SD_VARLINK_OBJECT, SD_VARLINK_MAP),
SD_VARLINK_DEFINE_FIELD(ooonm, SD_VARLINK_OBJECT, SD_VARLINK_NULLABLE|SD_VARLINK_MAP),
SD_VARLINK_DEFINE_FIELD(aaa, SD_VARLINK_ANY, 0),
SD_VARLINK_DEFINE_FIELD(aaan, SD_VARLINK_ANY, SD_VARLINK_NULLABLE),
SD_VARLINK_DEFINE_FIELD(aaaa, SD_VARLINK_ANY, SD_VARLINK_ARRAY),
SD_VARLINK_DEFINE_FIELD(aaana, SD_VARLINK_ANY, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY),
SD_VARLINK_DEFINE_FIELD(aaam, SD_VARLINK_ANY, SD_VARLINK_MAP),
SD_VARLINK_DEFINE_FIELD(aaanm, SD_VARLINK_ANY, SD_VARLINK_NULLABLE|SD_VARLINK_MAP),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(eee, EnumTest, 0),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(eeen, EnumTest, SD_VARLINK_NULLABLE),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(eeea, EnumTest, SD_VARLINK_ARRAY),
@@ -268,6 +275,7 @@ TEST(symbol_name_is_valid) {
assert_se(!varlink_idl_symbol_name_is_valid("float"));
assert_se(!varlink_idl_symbol_name_is_valid("string"));
assert_se(!varlink_idl_symbol_name_is_valid("object"));
assert_se(!varlink_idl_symbol_name_is_valid("any"));
}
TEST(field_name_is_valid) {