mirror of
https://github.com/systemd/systemd.git
synced 2026-07-26 11:20:26 +00:00
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:
committed by
Zbigniew Jędrzejewski-Szmek
parent
3a5b37e162
commit
2e51ed7fcb
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user