static inline list_t * parse_package_deps(JSON_Object *obj) { if (NULL == obj) return NULL; list_t *list = list_new(); if (NULL == list) { return NULL; } for (size_t i = 0; i < json_object_get_count(obj); i++) { const char *name = json_object_get_name(obj, i); if (!name) { list_destroy(list); return NULL; } const char *version = json_object_get_string_safe(obj, name); if (!version) { list_destroy(list); return NULL; } clib_package_dependency_t *dep = clib_package_dependency_new(name, version); if (NULL == dep) { list_destroy(list); return NULL; } list_node_t *node = list_node_new(dep); list_rpush(list, node); } return list; }
static inline list_t * parse_package_deps(JSON_Object *obj) { list_t *list = NULL; if (!obj) goto done; if (!(list = list_new())) goto done; list->free = clib_package_dependency_free; for (unsigned int i = 0; i < json_object_get_count(obj); i++) { const char *name = NULL; char *version = NULL; clib_package_dependency_t *dep = NULL; int error = 1; if (!(name = json_object_get_name(obj, i))) goto loop_cleanup; if (!(version = json_object_get_string_safe(obj, name))) goto loop_cleanup; if (!(dep = clib_package_dependency_new(name, version))) goto loop_cleanup; if (!(list_rpush(list, list_node_new(dep)))) goto loop_cleanup; error = 0; loop_cleanup: if (version) free(version); if (error) { list_destroy(list); list = NULL; break; } } done: return list; }
#include "describe/describe.h" #include "clib-package.h" describe("clib_package_dependency_new", { it("should return NULL when given bad input", { assert(NULL == clib_package_dependency_new("foo/bar", NULL)); assert(NULL == clib_package_dependency_new(NULL, "foo/bar")); }); it("should return a clib-dependency when given valid input", { clib_package_dependency_t *dep = clib_package_dependency_new("foo/bar", "1.2.3"); assert(dep); assert_str_equal("foo", dep->author); assert_str_equal("bar", dep->name); assert_str_equal("1.2.3", dep->version); clib_package_dependency_free(dep); }); it("should transform \"*\" to \"master\"", { clib_package_dependency_t *dep = clib_package_dependency_new("foo/bar", "*"); assert(dep); assert_str_equal("master", dep->version); clib_package_dependency_free(dep); }); it("should default to \"clibs\" when no repo author is given", { clib_package_dependency_t *dep = clib_package_dependency_new("foo", "master"); assert(dep); assert_str_equal("clibs", dep->author);