serial: update to use new object system

This commit is contained in:
2025-10-19 21:01:27 +01:00
parent 297ccdc9ce
commit 6e979579ea
5 changed files with 169 additions and 184 deletions

View File

@@ -40,7 +40,6 @@
#include <blue/ds/array.h>
#include <blue/ds/dict.h>
#include <blue/ds/number.h>
#include <blue/ds/object.h>
#include <blue/ds/string.h>
#include <blue/ds/uuid.h>
#include <ctype.h>
@@ -2933,21 +2932,21 @@ CJSON_PUBLIC(void) cJSON_free(void *object)
object = NULL;
}
static enum b_status b_dsref_to_cJSON(const struct b_dsref *object, cJSON **out);
static enum b_status b_object_to_cJSON(const b_object *object, cJSON **out);
static enum b_status serialise_array(const struct b_dsref *object, cJSON **out)
static enum b_status serialise_array(const b_object *object, cJSON **out)
{
cJSON *json_array = cJSON_CreateArray();
if (!json_array) {
return B_ERR_NO_MEMORY;
}
struct b_array *array = B_ARRAY(object);
b_array *array = (b_array *)object;
b_array_iterator it;
b_array_foreach(&it, array)
{
cJSON *child = NULL;
enum b_status status = b_dsref_to_cJSON(it.value, &child);
enum b_status status = b_object_to_cJSON(it.value, &child);
if (!B_OK(status)) {
cJSON_Delete(json_array);
return status;
@@ -2960,19 +2959,19 @@ static enum b_status serialise_array(const struct b_dsref *object, cJSON **out)
return B_SUCCESS;
}
static enum b_status serialise_dict(const struct b_dsref *object, cJSON **out)
static enum b_status serialise_dict(const b_object *object, cJSON **out)
{
cJSON *json_dict = cJSON_CreateObject();
if (!json_dict) {
return B_ERR_NO_MEMORY;
}
struct b_dict *dict = B_DICT(object);
b_dict *dict = (b_dict *)object;
b_dict_iterator it;
b_dict_foreach(&it, dict)
{
cJSON *child = NULL;
enum b_status status = b_dsref_to_cJSON(it.value, &child);
enum b_status status = b_object_to_cJSON(it.value, &child);
if (!B_OK(status)) {
cJSON_Delete(json_dict);
return status;
@@ -2985,15 +2984,15 @@ static enum b_status serialise_dict(const struct b_dsref *object, cJSON **out)
return B_SUCCESS;
}
static enum b_status serialise_number(const struct b_dsref *object, cJSON **out)
static enum b_status serialise_number(const b_object *object, cJSON **out)
{
cJSON *json_number = cJSON_CreateNumber(0);
if (!json_number) {
return B_ERR_NO_MEMORY;
}
struct b_number *number = B_NUMBER(object);
enum b_number_type type = b_number_get_type(number);
b_number *number = (b_number *)object;
enum b_number_type type = b_number_get_number_type(number);
switch (type) {
case B_NUMBER_INT8:
@@ -3049,9 +3048,9 @@ static enum b_status serialise_number(const struct b_dsref *object, cJSON **out)
return B_SUCCESS;
}
static enum b_status serialise_string(const struct b_dsref *object, cJSON **out)
static enum b_status serialise_string(const b_object *object, cJSON **out)
{
struct b_string *string = B_STRING(object);
b_string *string = (b_string *)object;
cJSON *json_string = cJSON_CreateStringReference(b_string_ptr(string));
if (!json_string) {
return B_ERR_NO_MEMORY;
@@ -3061,9 +3060,9 @@ static enum b_status serialise_string(const struct b_dsref *object, cJSON **out)
return B_SUCCESS;
}
static enum b_status serialise_uuid(const struct b_dsref *object, cJSON **out)
static enum b_status serialise_uuid(const b_object *object, cJSON **out)
{
struct b_uuid *uuid = B_UUID(object);
b_uuid *uuid = (b_uuid *)object;
char s[B_UUID_STRING_MAX];
b_uuid_to_cstr(uuid, s);
@@ -3076,39 +3075,28 @@ static enum b_status serialise_uuid(const struct b_dsref *object, cJSON **out)
return B_SUCCESS;
}
typedef enum b_status (*object_serialise_callback)(
const struct b_dsref *, cJSON **);
static const object_serialise_callback object_serialise[] = {
[B_DSREF_TYPE_ARRAY] = serialise_array,
[B_DSREF_TYPE_DICT] = serialise_dict,
[B_DSREF_TYPE_NUMBER] = serialise_number,
[B_DSREF_TYPE_STRING] = serialise_string,
[B_DSREF_TYPE_UUID] = serialise_uuid,
};
static const size_t nr_object_serialise
= sizeof object_serialise / sizeof object_serialise[0];
static enum b_status b_dsref_to_cJSON(const struct b_dsref *object, cJSON **out)
static enum b_status b_object_to_cJSON(const b_object *object, cJSON **out)
{
b_dsref_type_id type = b_typeid(object);
if (type >= nr_object_serialise) {
if (b_object_is_type(object, B_TYPE_ARRAY)) {
return serialise_array(object, out);
} else if (b_object_is_type(object, B_TYPE_DICT)) {
return serialise_dict(object, out);
} else if (b_object_is_type(object, B_TYPE_NUMBER)) {
return serialise_number(object, out);
} else if (b_object_is_type(object, B_TYPE_STRING)) {
return serialise_string(object, out);
} else if (b_object_is_type(object, B_TYPE_UUID)) {
return serialise_uuid(object, out);
} else {
return B_ERR_NOT_SUPPORTED;
}
object_serialise_callback callback = object_serialise[type];
if (!callback) {
return B_ERR_NOT_SUPPORTED;
}
return callback(object, out);
}
static enum b_status cJSON_to_b_dsref(cJSON *json, struct b_dsref **out);
static enum b_status cJSON_to_b_object(cJSON *json, b_object **out);
static enum b_status deserialise_dict(cJSON *json, struct b_dsref **out)
static enum b_status deserialise_dict(cJSON *json, b_object **out)
{
struct b_dict *dict = b_dict_create();
b_dict *dict = b_dict_create();
if (!dict) {
return B_ERR_NO_MEMORY;
}
@@ -3117,29 +3105,29 @@ static enum b_status deserialise_dict(cJSON *json, struct b_dsref **out)
enum b_status status = B_SUCCESS;
while (item) {
struct b_dsref *child = NULL;
status = cJSON_to_b_dsref(item, &child);
b_object *child = NULL;
status = cJSON_to_b_object(item, &child);
if (!B_OK(status)) {
b_dict_release(dict);
b_dict_unref(dict);
dict = NULL;
break;
}
if (child) {
b_dict_put(dict, item->string, child);
b_release(child);
b_object_unref(child);
}
item = item->next;
}
*out = B_DSREF(dict);
*out = (dict);
return B_SUCCESS;
}
static enum b_status deserialise_array(cJSON *json, struct b_dsref **out)
static enum b_status deserialise_array(cJSON *json, b_object **out)
{
struct b_array *array = b_array_create();
b_array *array = b_array_create();
if (!array) {
return B_ERR_NO_MEMORY;
}
@@ -3148,40 +3136,40 @@ static enum b_status deserialise_array(cJSON *json, struct b_dsref **out)
enum b_status status = B_SUCCESS;
while (item) {
struct b_dsref *child = NULL;
status = cJSON_to_b_dsref(item, &child);
b_object *child = NULL;
status = cJSON_to_b_object(item, &child);
if (!B_OK(status)) {
b_array_release(array);
b_array_unref(array);
array = NULL;
break;
}
if (child) {
b_array_append(array, child);
b_release(child);
b_object_unref(child);
}
item = item->next;
}
*out = B_DSREF(array);
*out = (array);
return B_SUCCESS;
}
static enum b_status deserialise_string(cJSON *json, struct b_dsref **out)
static enum b_status deserialise_string(cJSON *json, b_object **out)
{
struct b_string *string = b_string_create_from_cstr(json->valuestring);
b_string *string = b_string_create_from_cstr(json->valuestring);
if (!string) {
return B_ERR_NO_MEMORY;
}
*out = B_DSREF(string);
*out = (string);
return B_SUCCESS;
}
static enum b_status deserialise_number(cJSON *json, struct b_dsref **out)
static enum b_status deserialise_number(cJSON *json, b_object **out)
{
struct b_number *number = NULL;
b_number *number = NULL;
if ((double)json->valueint == json->valuedouble) {
number = B_INT(json->valueint);
@@ -3193,13 +3181,13 @@ static enum b_status deserialise_number(cJSON *json, struct b_dsref **out)
return B_ERR_NO_MEMORY;
}
*out = B_DSREF(number);
*out = (number);
return B_SUCCESS;
}
static enum b_status deserialise_bool(cJSON *json, struct b_dsref **out)
static enum b_status deserialise_bool(cJSON *json, b_object **out)
{
struct b_number *number = NULL;
b_number *number = NULL;
if (json->type == cJSON_True) {
number = B_INT(1);
@@ -3211,11 +3199,11 @@ static enum b_status deserialise_bool(cJSON *json, struct b_dsref **out)
return B_ERR_NO_MEMORY;
}
*out = B_DSREF(number);
*out = (number);
return B_SUCCESS;
}
static enum b_status cJSON_to_b_dsref(cJSON *json, struct b_dsref **out)
static enum b_status cJSON_to_b_object(cJSON *json, b_object **out)
{
switch (json->type) {
case cJSON_True:
@@ -3238,11 +3226,11 @@ static enum b_status cJSON_to_b_dsref(cJSON *json, struct b_dsref **out)
}
static enum b_status json_serialise(
struct b_serial_ctx *ctx, struct b_dsref *src, struct b_stream *dest,
struct b_serial_ctx *ctx, b_object *src, struct b_stream *dest,
enum b_serial_flags flags)
{
cJSON *json;
enum b_status status = b_dsref_to_cJSON(src, &json);
enum b_status status = b_object_to_cJSON(src, &json);
if (!B_OK(status)) {
return status;
@@ -3269,14 +3257,14 @@ static enum b_status json_serialise(
}
static enum b_status json_deserialise(
struct b_serial_ctx *ctx, struct b_stream *src, struct b_dsref **dest,
struct b_serial_ctx *ctx, struct b_stream *src, b_object **dest,
enum b_serial_flags flags)
{
struct b_string *json_string = b_string_create();
b_string *json_string = b_string_create();
struct b_stream *json_stream = NULL;
enum b_status status = b_string_open_stream(json_string, &json_stream);
if (!B_OK(status)) {
b_string_release(json_string);
b_string_unref(json_string);
return status;
}
@@ -3284,17 +3272,17 @@ static enum b_status json_deserialise(
src, json_stream, ctx->ctx_pipeline, NULL);
b_stream_close(json_stream);
if (!B_OK(status)) {
b_string_release(json_string);
b_string_unref(json_string);
return status;
}
cJSON *json = cJSON_Parse(b_string_ptr(json_string));
b_string_release(json_string);
b_string_unref(json_string);
if (!json) {
return B_ERR_BAD_FORMAT;
}
status = cJSON_to_b_dsref(json, dest);
status = cJSON_to_b_object(json, dest);
cJSON_Delete(json);