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        },