+ json_object_array_add(a, x);
+ return o;
+}
+
+static struct json_object *addperm_key_val(struct json_object *o, const char *key, struct json_object *val)
+{
+ struct json_object *x = json_object_new_object();
+ json_object_object_add(x, key, val);
+ return addperm(o, x);
+}
+
+static struct json_object *addperm_key_valstr(struct json_object *o, const char *key, const char *val)
+{
+ return addperm_key_val(o, key, json_object_new_string(val));
+}
+
+static struct json_object *addperm_key_valint(struct json_object *o, const char *key, int val)
+{
+ return addperm_key_val(o, key, json_object_new_int(val));
+}
+
+static struct json_object *make_description_openAPIv3(struct api_so_v1 *desc)
+{
+ char buffer[256];
+ const struct afb_verb_desc_v1 *verb;
+ struct json_object *r, *f, *a, *i, *p, *g;
+
+ r = json_object_new_object();
+ json_object_object_add(r, "openapi", json_object_new_string("3.0.0"));
+
+ i = json_object_new_object();
+ json_object_object_add(r, "info", i);
+ json_object_object_add(i, "title", json_object_new_string(afb_export_apiname(desc->export)));
+ json_object_object_add(i, "version", json_object_new_string("0.0.0"));
+ json_object_object_add(i, "description", json_object_new_string(desc->binding->v1.info ?: afb_export_apiname(desc->export)));
+
+ p = json_object_new_object();
+ json_object_object_add(r, "paths", p);
+ verb = desc->binding->v1.verbs;
+ while (verb->name) {
+ buffer[0] = '/';
+ strncpy(buffer + 1, verb->name, 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 = NULL;
+ if (verb->session & AFB_SESSION_CLOSE_V1)
+ a = addperm_key_valstr(a, "session", "close");
+ if (verb->session & AFB_SESSION_CHECK_V1)
+ a = addperm_key_valstr(a, "session", "check");
+ if (verb->session & AFB_SESSION_RENEW_V1)
+ a = addperm_key_valstr(a, "token", "refresh");
+ if (verb->session & AFB_SESSION_LOA_MASK_V1)
+ a = addperm_key_valint(a, "LOA", (verb->session >> AFB_SESSION_LOA_SHIFT_V1) & AFB_SESSION_LOA_MASK_V1);
+ if (a)
+ json_object_object_add(g, "x-permissions", a);