json: add new json_variant_set_field() helper
This commit is contained in:
parent
f2ff34ff2a
commit
78a41236e4
|
@ -1675,6 +1675,75 @@ int json_variant_filter(JsonVariant **v, char **to_remove) {
|
||||||
return (int) n;
|
return (int) n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *value) {
|
||||||
|
_cleanup_(json_variant_unrefp) JsonVariant *field_variant = NULL, *w = NULL;
|
||||||
|
_cleanup_free_ JsonVariant **array = NULL;
|
||||||
|
size_t i, k = 0;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(v);
|
||||||
|
assert(field);
|
||||||
|
|
||||||
|
if (json_variant_is_blank_object(*v)) {
|
||||||
|
array = new(JsonVariant*, 2);
|
||||||
|
if (!array)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (!json_variant_is_object(*v))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
for (i = 0; i < json_variant_elements(*v); i += 2) {
|
||||||
|
JsonVariant *p;
|
||||||
|
|
||||||
|
p = json_variant_by_index(*v, i);
|
||||||
|
if (!json_variant_is_string(p))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (streq(json_variant_string(p), field)) {
|
||||||
|
|
||||||
|
if (!array) {
|
||||||
|
array = new(JsonVariant*, json_variant_elements(*v));
|
||||||
|
if (!array)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (k = 0; k < i; k++)
|
||||||
|
array[k] = json_variant_by_index(*v, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (array) {
|
||||||
|
array[k++] = p;
|
||||||
|
array[k++] = json_variant_by_index(*v, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array) {
|
||||||
|
array = new(JsonVariant*, json_variant_elements(*v) + 2);
|
||||||
|
if (!array)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (k = 0; k < json_variant_elements(*v); k++)
|
||||||
|
array[k] = json_variant_by_index(*v, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = json_variant_new_string(&field_variant, field);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
array[k++] = field_variant;
|
||||||
|
array[k++] = value;
|
||||||
|
|
||||||
|
r = json_variant_new_object(&w, array, k);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
json_variant_unref(*v);
|
||||||
|
*v = TAKE_PTR(w);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int json_variant_copy(JsonVariant **nv, JsonVariant *v) {
|
static int json_variant_copy(JsonVariant **nv, JsonVariant *v) {
|
||||||
JsonVariantType t;
|
JsonVariantType t;
|
||||||
JsonVariant *c;
|
JsonVariant *c;
|
||||||
|
|
|
@ -169,6 +169,8 @@ void json_variant_dump(JsonVariant *v, JsonFormatFlags flags, FILE *f, const cha
|
||||||
|
|
||||||
int json_variant_filter(JsonVariant **v, char **to_remove);
|
int json_variant_filter(JsonVariant **v, char **to_remove);
|
||||||
|
|
||||||
|
int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *value);
|
||||||
|
|
||||||
int json_parse(const char *string, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
int json_parse(const char *string, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
||||||
int json_parse_continue(const char **p, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
int json_parse_continue(const char **p, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
||||||
int json_parse_file(FILE *f, const char *path, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
int json_parse_file(FILE *f, const char *path, JsonVariant **ret, unsigned *ret_line, unsigned *ret_column);
|
||||||
|
|
Loading…
Reference in a new issue