Mercurial > sci
diff scictl/scictl.c @ 27:dae2de19ca5d
misc: switch to JSON everywhere
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 03 Aug 2022 15:18:09 +0200 |
parents | 34cbbd215ef7 |
children | 8c2087e7d381 |
line wrap: on
line diff
--- a/scictl/scictl.c Tue Aug 02 13:24:13 2022 +0200 +++ b/scictl/scictl.c Wed Aug 03 15:18:09 2022 +0200 @@ -16,22 +16,24 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <errno.h> #include <limits.h> -#include <errno.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <utlist.h> + #include "apic.h" #include "config.h" -#include "types.h" #include "util.h" static void usage(void) { - fprintf(stderr, "usage: %s [-u baseurl] command [args...]\n", getprogname()); + fprintf(stderr, "usage: scictl [-u baseurl] command [args...]\n"); exit(1); } @@ -40,7 +42,6 @@ { fprintf(stderr, "usage: scictl job-add project tag\n"); fprintf(stderr, " scictl job-todo worker\n"); - fprintf(stderr, " scictl jobresult-add id worker exitcode console\n"); fprintf(stderr, " scictl project-add name desc url script\n"); fprintf(stderr, " scictl project-info name\n"); fprintf(stderr, " scictl project-list\n"); @@ -50,13 +51,6 @@ exit(0); } -static inline void -replace(char **str, const char *new) -{ - free(*str); - *str = util_strdup(new); -} - long long toint(const char *s) { @@ -98,97 +92,103 @@ return console; } +static inline intmax_t +get_int(json_t *obj, const char *key) +{ + json_t *val; + + if ((val = json_object_get(obj, key)) && json_is_integer(val)) + return json_integer_value(val); + + return 0; +} + +static inline const char * +get_string(json_t *obj, const char *key) +{ + json_t *val; + + if ((val = json_object_get(obj, key)) && json_is_string(val)) + return json_string_value(val); + + return ""; +} + static void cmd_job_add(int argc, char **argv) { - struct job job = {0}; struct apic req; + json_t *obj; if (argc < 3) usage(); - job.project_name = util_strdup(argv[1]); - job.tag = util_strdup(argv[2]); + obj = json_pack("{ss ss}", + "project_name", argv[1], + "tag", argv[2] + ); - if (apic_job_add(&req, &job) < 0) + if (apic_job_add(&req, obj) < 0) util_die("abort: %s\n", req.error); - apic_finish(&req); - job_finish(&job); + json_decref(obj); } static void cmd_job_todo(int argc, char **argv) { - struct job jobs[SCI_JOB_LIST_MAX] = {0}; - size_t jobsz; struct apic req; + json_t *array, *obj; + size_t i; if (argc < 2) usage(); - if ((jobsz = apic_job_todo(&req, jobs, UTIL_SIZE(jobs), argv[1]))) + if ((array = apic_job_todo(&req, argv[1]))) util_die("abort: %s\n", req.error); - for (size_t i = 0; i < jobsz; ++i) { - printf("%-16s%jd\n", "id:", jobs[i].id); - printf("%-16s%s\n", "tag:", jobs[i].tag); - printf("%-16s%s\n", "project:", jobs[i].project_name); + json_array_foreach(array, i, obj) { + printf("%-16s%jd\n", "id:", get_int(obj, "id")); + printf("%-16s%s\n", "tag:", get_string(obj, "tag")); + printf("%-16s%s\n", "project:", get_string(obj, "project_name")); - if (i + 1 < jobsz) + if (i + 1 < json_array_size(array)) printf("\n"); - - job_finish(&jobs[i]); } - apic_finish(&req); -} - -static void -cmd_jobresult_add(int argc, char **argv) -{ - struct jobresult res = {0}; - struct apic req; - - if (argc < 5) - usage(); - - res.job_id = toint(argv[1]); - res.worker_name = util_strdup(argv[2]); - res.exitcode = toint(argv[3]); - res.log = readfile(argv[4]); - - if (apic_jobresult_add(&req, &res) < 0) - util_die("abort: unable to add job result: %s\n", req.error); - - apic_finish(&req); - jobresult_finish(&res); + json_decref(array); } static void cmd_project_add(int argc, char **argv) { - struct project pc = {0}; struct apic req; + char *script; + json_t *obj; if (argc < 5) usage(); - pc.name = util_strdup(argv[1]); - pc.desc = util_strdup(argv[2]); - pc.url = util_strdup(argv[3]); - pc.script = readfile(argv[4]); + script = readfile(argv[4]); + obj = json_pack("{ss ss ss ss}", + "name", argv[1], + "desc", argv[2], + "url", argv[3], + "script", script + ); - if (apic_project_save(&req, &pc) < 0) + if (apic_project_save(&req, obj) < 0) util_die("abort: unable to create project: %s\n", req.error); - apic_finish(&req); - project_finish(&pc); + json_decref(obj); } static void cmd_project_update(int argc, char **argv) { + (void)argc; + (void)argv; +#if 0 struct project pc; struct apic req; @@ -212,27 +212,27 @@ apic_finish(&req); project_finish(&pc); +#endif } static void cmd_project_info(int argc, char **argv) { - struct project project = {0}; struct apic req; + json_t *obj; if (argc < 2) usage(); - if (apic_project_find(&req, &project, argv[1]) < 0) + if (!(obj = apic_project_find(&req, argv[1]))) util_die("abort: unable to find project: %s\n", req.error); - printf("%-16s%s\n", "name:", project.name); - printf("%-16s%s\n", "desc:", project.desc); - printf("%-16s%s\n", "url:", project.url); + printf("%-16s%s\n", "name:", get_string(obj, "name")); + printf("%-16s%s\n", "desc:", get_string(obj, "desc")); + printf("%-16s%s\n", "url:", get_string(obj, "url")); printf("\n"); - printf("%s", project.script); + printf("%s", get_string(obj, "script")); - apic_finish(&req); - project_finish(&project); + json_decref(obj); } static void @@ -241,44 +241,43 @@ (void)argc; (void)argv; - struct project projects[SCI_PROJECT_MAX] = {0}; struct apic req; - ssize_t projectsz; + json_t *array, *obj; + size_t i; - if ((projectsz = apic_project_list(&req, projects, UTIL_SIZE(projects))) < 0) + if (!(array = apic_project_list(&req))) util_die("abort: unable to list projects: %s\n", req.error); - for (ssize_t i = 0; i < projectsz; ++i) { - printf("%-16s%s\n", "name:", projects[i].name); - printf("%-16s%s\n", "desc:", projects[i].desc); - printf("%-16s%s\n", "url:", projects[i].url); + json_array_foreach(array, i, obj) { + printf("%-16s%s\n", "name:", get_string(obj, "name")); + printf("%-16s%s\n", "desc:", get_string(obj, "desc")); + printf("%-16s%s\n", "url:", get_string(obj, "url")); - if (i + 1 < projectsz) + if (i + 1 < json_array_size(array)) printf("\n"); - - project_finish(&projects[i]); } - apic_finish(&req); + json_decref(array); } static void cmd_worker_add(int argc, char **argv) { - struct worker wk = {0}; struct apic req; + json_t *obj; if (argc < 3) usage(); - wk.name = util_strdup(argv[1]); - wk.desc = util_strdup(argv[2]); + obj = json_pack("{ss ss}", + "name", argv[1], + "desc", argv[2] + ); - if (apic_worker_save(&req, &wk) < 0) + if (apic_worker_save(&req, obj) < 0) util_die("abort: unable to save worker: %s\n", req.error); - worker_finish(&wk); - apic_finish(&req); + json_decref(obj); } static void @@ -287,24 +286,22 @@ (void)argc; (void)argv; - struct worker wk[SCI_WORKER_MAX]; struct apic req; - ssize_t wksz; + json_t *array, *obj; + size_t i; - if ((wksz = apic_worker_list(&req, wk, UTIL_SIZE(wk))) < 0) + if (!(array = apic_worker_list(&req))) util_die("abort: unable to list worker: %s\n", req.error); - for (ssize_t i = 0; i < wksz; ++i) { - printf("%-16s%s\n", "name:", wk[i].name); - printf("%-16s%s\n", "desc:", wk[i].desc); + json_array_foreach(array, i, obj) { + printf("%-16s%s\n", "name:", get_string(obj, "name")); + printf("%-16s%s\n", "desc:", get_string(obj, "desc")); - if (i + 1 < wksz) + if (i + 1 < json_array_size(array)) printf("\n"); - - worker_finish(&wk[i]); } - apic_finish(&req); + json_decref(array); } static struct { @@ -313,7 +310,6 @@ } commands[] = { { "job-add", cmd_job_add }, { "job-todo", cmd_job_todo }, - { "jobresult-add", cmd_jobresult_add }, { "project-add", cmd_project_add }, { "project-info", cmd_project_info }, { "project-list", cmd_project_list },