afb-api-v3: Simplify the code
[src/app-framework-binder.git] / src / afb-api-v3.c
index 39f627a..7f63b6e 100644 (file)
@@ -120,11 +120,34 @@ void afb_api_v3_process_call(struct afb_api_v3 *api, struct afb_xreq *xreq)
        afb_xreq_reply_unknown_verb(xreq);
 }
 
+static struct json_object *describe_verb_v3(const struct afb_verb_v3 *verb)
+{
+       struct json_object *f, *a, *g;
+
+       f = json_object_new_object();
+
+       g = json_object_new_object();
+       json_object_object_add(f, "get", g);
+
+       a = afb_auth_json_v2(verb->auth, verb->session);
+       if (a)
+               json_object_object_add(g, "x-permissions", a);
+
+       a = json_object_new_object();
+       json_object_object_add(g, "responses", a);
+       g = json_object_new_object();
+       json_object_object_add(a, "200", g);
+       json_object_object_add(g, "description", json_object_new_string(verb->info?:verb->verb));
+
+       return f;
+}
+
 struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api, const char *apiname)
 {
        char buffer[256];
-       struct afb_verb_v3 **iter, **end, *verb;
-       struct json_object *r, *f, *a, *i, *p, *g;
+       struct afb_verb_v3 **iter, **end;
+       const struct afb_verb_v3 *verb;
+       struct json_object *r, *i, *p;
 
        r = json_object_new_object();
        json_object_object_add(r, "openapi", json_object_new_string("3.0.0"));
@@ -143,22 +166,16 @@ struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api
                verb = *iter++;
                buffer[0] = '/';
                strncpy(buffer + 1, verb->verb, sizeof buffer - 1);
-               buffer[sizeof buffer - 1] = 0;
-               f = json_object_new_object();
-               json_object_object_add(p, buffer, f);
-               g = json_object_new_object();
-               json_object_object_add(f, "get", g);
-
-               a = afb_auth_json_v2(verb->auth, verb->session);
-               if (a)
-                       json_object_object_add(g, "x-permissions", a);
-
-               a = json_object_new_object();
-               json_object_object_add(g, "responses", a);
-               f = json_object_new_object();
-               json_object_object_add(a, "200", f);
-               json_object_object_add(f, "description", json_object_new_string(verb->info?:verb->verb));
+               json_object_object_add(p, buffer, describe_verb_v3(verb));
        }
+       verb = api->verbsv3;
+       if (verb)
+               while(verb->verb) {
+                       buffer[0] = '/';
+                       strncpy(buffer + 1, verb->verb, sizeof buffer - 1);
+                       json_object_object_add(p, buffer, describe_verb_v3(verb));
+                       verb++;
+               }
        return r;
 }
 
@@ -177,8 +194,10 @@ struct afb_api_v3 *afb_api_v3_create(
 
        /* allocates the description */
        api = calloc(1, sizeof *api + (copy_info && info ? 1 + strlen(info) : 0));
-       if (!api)
+       if (!api) {
+               ERROR("out of memory");
                goto oom;
+       }
        api->refcount = 1;
        if (!info)
                api->info = &nulchar;
@@ -206,7 +225,6 @@ oom3:
 oom2:
        free(api);
 oom:
-       ERROR("out of memory");
        return NULL;
 }
 
@@ -221,6 +239,9 @@ void afb_api_v3_unref(struct afb_api_v3 *api)
 {
        if (api && !__atomic_sub_fetch(&api->refcount, 1, __ATOMIC_RELAXED)) {
                afb_export_destroy(api->export);
+               while (api->count)
+                       free(api->verbs[--api->count]);
+               free(api->verbs);
                free(api);
        }
 }
@@ -304,19 +325,16 @@ int afb_api_v3_del_verb(
                const char *verb,
                void **vcbdata)
 {
-       struct afb_verb_v3 **v, **e, *i;
+       struct afb_verb_v3 *v;
+       int i;
 
-       v = api->verbs;
-       e = &v[api->count];
-       while (v != e) {
-               i = *v++;
-               if (!strcasecmp(i->verb, verb)) {
-                       api->count--;
+       for (i = 0 ; i < api->count ; i++) {
+               v = api->verbs[i];
+               if (!strcasecmp(verb, v->verb)) {
+                       api->verbs[i] = api->verbs[--api->count];
                        if (vcbdata)
-                               *vcbdata = i->vcbdata;
-                       if (v != e)
-                               *--v = *--e;
-                       free(i);
+                               *vcbdata = v->vcbdata;
+                       free(v);
                        return 0;
                }
        }