From 5baf46bb185c994b4fef1049fe1e650b857d3d98 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:24:46 +0800 Subject: [PATCH] feat: add driver json enconder --- src/parser/neu_json_global_config.c | 76 ++++++++++++++++++++++++++--- src/parser/neu_json_global_config.h | 3 ++ src/parser/neu_json_node.c | 8 +++ src/parser/neu_json_tag.c | 62 +++++++++++++++++++++++ src/parser/neu_json_tag.h | 2 + 5 files changed, 144 insertions(+), 7 deletions(-) diff --git a/src/parser/neu_json_global_config.c b/src/parser/neu_json_global_config.c index d0dda577..dac464f4 100644 --- a/src/parser/neu_json_global_config.c +++ b/src/parser/neu_json_global_config.c @@ -405,6 +405,27 @@ void neu_json_decode_global_config_req_free(neu_json_global_config_req_t *req) } } +int neu_json_encode_driver(void *node_json, void *param) +{ + neu_json_driver_t *driver = param; + + if (!json_is_object((json_t *) node_json)) { + return -1; + } + + if (0 != neu_json_encode_add_node_req(node_json, &driver->node)) { + return -1; + } + + json_t *groups_json = json_array(); + if (NULL == groups_json || + 0 != json_object_set_new(node_json, "groups", groups_json)) { + return -1; + } + + return neu_json_encode_gtag_array(groups_json, &driver->gtags); +} + int neu_json_decode_driver_json(void *node_json, neu_json_driver_t *driver_p) { if (!json_is_object((json_t *) node_json)) { @@ -423,7 +444,7 @@ int neu_json_decode_driver_json(void *node_json, neu_json_driver_t *driver_p) json_t *groups_json = json_object_get(node_json, "groups"); if (NULL == groups_json) { - return 0; + return -1; } if (!json_is_array(groups_json)) { @@ -445,15 +466,33 @@ void neu_json_driver_fini(neu_json_driver_t *req) neu_json_decode_gtag_array_fini(&req->gtags); } -int neu_json_decode_driver_array_json(void * obj_json, - neu_json_driver_array_t *arr) +int neu_json_encode_driver_array(void *obj_json, void *param) { - json_t *root = obj_json; - if (!json_is_object(root)) { + neu_json_driver_array_t *arr = param; + + json_t *nodes_json = obj_json; + if (!json_is_array(nodes_json)) { return -1; } - json_t *nodes_json = json_object_get(root, "nodes"); + for (int i = 0; i < arr->n_driver; ++i) { + json_t *node_json = json_object(); + if (NULL == node_json || + 0 != json_array_append_new(nodes_json, node_json)) { + return -1; + } + if (0 != neu_json_encode_driver(node_json, &arr->drivers[i])) { + return -1; + } + } + + return 0; +} + +int neu_json_decode_driver_array_json(void * obj_json, + neu_json_driver_array_t *arr) +{ + json_t *nodes_json = obj_json; if (!json_is_array(nodes_json)) { return -1; } @@ -489,6 +528,22 @@ void neu_json_driver_array_fini(neu_json_driver_array_t *arr) free(arr->drivers); } +int neu_json_encode_drivers_req(void *obj_json, void *param) +{ + json_t *root = obj_json; + if (!json_is_object(root)) { + return -1; + } + + json_t *nodes_json = json_array(); + if (NULL == nodes_json || + 0 != json_object_set_new(root, "nodes", nodes_json)) { + return -1; + } + + return neu_json_encode_driver_array(nodes_json, param); +} + int neu_json_decode_drivers_req(char *buf, neu_json_drivers_req_t **result) { int ret = 0; @@ -503,7 +558,14 @@ int neu_json_decode_drivers_req(char *buf, neu_json_drivers_req_t **result) return -1; } - ret = neu_json_decode_driver_array_json(json_obj, req); + json_t *nodes_json = json_object_get(json_obj, "nodes"); + if (!json_is_array(nodes_json)) { + neu_json_decode_free(json_obj); + free(req); + return -1; + } + + ret = neu_json_decode_driver_array_json(nodes_json, req); if (0 == ret) { *result = req; } else { diff --git a/src/parser/neu_json_global_config.h b/src/parser/neu_json_global_config.h index f688743b..05a3448c 100644 --- a/src/parser/neu_json_global_config.h +++ b/src/parser/neu_json_global_config.h @@ -77,6 +77,7 @@ typedef struct { neu_json_gtag_array_t gtags; } neu_json_driver_t; +int neu_json_encode_driver(void *node_json, void *param); int neu_json_decode_driver_json(void *node_json, neu_json_driver_t *driver_p); void neu_json_driver_fini(neu_json_driver_t *req); @@ -85,12 +86,14 @@ typedef struct { neu_json_driver_t *drivers; } neu_json_driver_array_t; +int neu_json_encode_driver_array(void *obj_json, void *param); int neu_json_decode_driver_array_json(void * obj_json, neu_json_driver_array_t *arr); void neu_json_driver_array_fini(neu_json_driver_array_t *arr); typedef neu_json_driver_array_t neu_json_drivers_req_t; +int neu_json_encode_drivers_req(void *obj_json, void *param); int neu_json_decode_drivers_req(char *buf, neu_json_drivers_req_t **result); void neu_json_decode_drivers_req_free(neu_json_drivers_req_t *req); diff --git a/src/parser/neu_json_node.c b/src/parser/neu_json_node.c index 44779ffd..350a6635 100644 --- a/src/parser/neu_json_node.c +++ b/src/parser/neu_json_node.c @@ -50,6 +50,14 @@ int neu_json_encode_add_node_req(void *json_object, void *param) ret = neu_json_encode_field(json_object, req_elems, NEU_JSON_ELEM_SIZE(req_elems)); + if (0 != ret) { + return -1; + } + + if (req->setting) { + ret = neu_json_load_key(json_object, "params", req->setting, false); + } + return ret; } diff --git a/src/parser/neu_json_tag.c b/src/parser/neu_json_tag.c index 5552f825..a5fe338f 100644 --- a/src/parser/neu_json_tag.c +++ b/src/parser/neu_json_tag.c @@ -427,6 +427,46 @@ int neu_json_encode_au_tags_resp(void *json_object, void *param) return ret; } +int neu_json_encode_gtag(void *json_obj, void *param) +{ + neu_json_gtag_t *gtag = param; + json_t * gtag_json = json_obj; + + if (!json_is_object(gtag_json)) { + return -1; + } + + json_t *tags_json = json_array(); + if (NULL == tags_json || + 0 != json_object_set_new(gtag_json, "tags", tags_json)) { + return -1; + } + + neu_json_tag_array_t arr = { + .len = gtag->n_tag, + .tags = gtag->tags, + }; + if (0 != neu_json_encode_tag_array(tags_json, &arr)) { + return -1; + } + + neu_json_elem_t gtag_elems[] = { + { + .name = "group", + .t = NEU_JSON_STR, + .v.val_str = gtag->group, + }, + { + .name = "interval", + .t = NEU_JSON_INT, + .v.val_int = gtag->interval, + }, + }; + + return neu_json_encode_field(gtag_json, gtag_elems, + NEU_JSON_ELEM_SIZE(gtag_elems)); +} + int neu_json_decode_gtag_json(void *json_obj, neu_json_gtag_t *gtag_p) { if (NULL == gtag_p) { @@ -483,6 +523,28 @@ void neu_json_decode_gtag_fini(neu_json_gtag_t *gtag) free(gtag->tags); } +int neu_json_encode_gtag_array(void *json_obj, void *param) +{ + neu_json_gtag_array_t *arr = param; + + if (!json_is_array((json_t *) json_obj)) { + return -1; + } + + for (int i = 0; i < arr->len; i++) { + json_t *gtag_json = json_object(); + if (NULL == gtag_json || + 0 != json_array_append_new(json_obj, gtag_json)) { + return -1; + } + if (0 != neu_json_encode_gtag(gtag_json, &arr->gtags[i])) { + return -1; + } + } + + return 0; +} + int neu_json_decode_gtag_array_json(void *json_obj, neu_json_gtag_array_t *arr) { int len = 0; diff --git a/src/parser/neu_json_tag.h b/src/parser/neu_json_tag.h index e584412a..2bb6aeb2 100644 --- a/src/parser/neu_json_tag.h +++ b/src/parser/neu_json_tag.h @@ -82,6 +82,7 @@ typedef struct { neu_json_tag_t *tags; } neu_json_gtag_t; +int neu_json_encode_gtag(void *json_obj, void *param); int neu_json_decode_gtag_json(void *json_obj, neu_json_gtag_t *gtag_p); void neu_json_decode_gtag_fini(neu_json_gtag_t *gtag); @@ -90,6 +91,7 @@ typedef struct { neu_json_gtag_t *gtags; } neu_json_gtag_array_t; +int neu_json_encode_gtag_array(void *json_obj, void *param); int neu_json_decode_gtag_array_json(void *json_obj, neu_json_gtag_array_t *arr); void neu_json_decode_gtag_array_fini(neu_json_gtag_array_t *arr);