task list woo
This commit is contained in:
@@ -18,27 +18,8 @@ asana_err asana_parse(char *json, void *resource) {
|
|||||||
if (parsed != NULL) {
|
if (parsed != NULL) {
|
||||||
cJSON *data = cJSON_GetObjectItemCaseSensitive(parsed, "data");
|
cJSON *data = cJSON_GetObjectItemCaseSensitive(parsed, "data");
|
||||||
if (cJSON_IsObject(data)) {
|
if (cJSON_IsObject(data)) {
|
||||||
cJSON *resource_type = cJSON_GetObjectItemCaseSensitive(data, "resource_type");
|
asana_extract(data, resource);
|
||||||
|
|
||||||
if (cJSON_IsString(resource_type)) {
|
|
||||||
char *typ = resource_type->valuestring;
|
|
||||||
|
|
||||||
fprintf(stderr, "Parsing a %s\n", typ);
|
|
||||||
ret = ASANA_ERR_OK;
|
ret = ASANA_ERR_OK;
|
||||||
|
|
||||||
if (strcmp(typ, "user") == 0) {
|
|
||||||
asana_extract_user(data, resource);
|
|
||||||
} else if (strcmp(typ, "workspace") == 0) {
|
|
||||||
asana_extract_resource(data, resource);
|
|
||||||
} else if (strcmp(typ, "task") == 0) {
|
|
||||||
asana_extract_task(data, resource);
|
|
||||||
} else if (strcmp(typ, "project") == 0 || strcmp(typ, "user_task_list") == 0) {
|
|
||||||
asana_extract_project(data, resource);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Unknown resource type: %s\n", typ);
|
|
||||||
ret = ASANA_ERR_UNKNOWN_TYPE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +27,56 @@ asana_err asana_parse(char *json, void *resource) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void asana_extract(cJSON *data, void *resource) {
|
||||||
|
cJSON *resource_type = cJSON_GetObjectItemCaseSensitive(data, "resource_type");
|
||||||
|
|
||||||
|
if (cJSON_IsString(resource_type)) {
|
||||||
|
char *typ = resource_type->valuestring;
|
||||||
|
|
||||||
|
fprintf(stderr, "Parsing a %s\n", typ);
|
||||||
|
|
||||||
|
if (strcmp(typ, "user") == 0) {
|
||||||
|
asana_extract_user(data, resource);
|
||||||
|
} else if (strcmp(typ, "workspace") == 0) {
|
||||||
|
asana_extract_resource(data, resource);
|
||||||
|
} else if (strcmp(typ, "task") == 0) {
|
||||||
|
asana_extract_task(data, resource);
|
||||||
|
} else if (strcmp(typ, "project") == 0 || strcmp(typ, "user_task_list") == 0) {
|
||||||
|
asana_extract_project(data, resource);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Unknown resource type: %s\n", typ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void **asana_parse_array(char *json, size_t item_size, size_t *items) {
|
||||||
|
if (json == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *ret = NULL;
|
||||||
|
cJSON *parsed = cJSON_Parse(json);
|
||||||
|
|
||||||
|
if (parsed != NULL) {
|
||||||
|
cJSON *data = cJSON_GetObjectItemCaseSensitive(parsed, "data");
|
||||||
|
if (cJSON_IsArray(data)) {
|
||||||
|
*items = cJSON_GetArraySize(data);
|
||||||
|
ret = calloc(item_size, *items);
|
||||||
|
|
||||||
|
cJSON *item = NULL;
|
||||||
|
size_t i=0;
|
||||||
|
cJSON_ArrayForEach(item, data) {
|
||||||
|
asana_extract(item, (char *)ret+(i*item_size));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON_Delete(parsed);
|
||||||
|
return (void **)ret;
|
||||||
|
}
|
||||||
|
|
||||||
void asana_extract_user(cJSON *json, User *user) {
|
void asana_extract_user(cJSON *json, User *user) {
|
||||||
user->type = USER;
|
user->type = USER;
|
||||||
asana_extract_resource(json, (Resource *)user);
|
asana_extract_resource(json, (Resource *)user);
|
||||||
@@ -110,6 +141,7 @@ void asana_extract_resource(cJSON *json, Resource *resource) {
|
|||||||
if (cJSON_IsString(gid)) {
|
if (cJSON_IsString(gid)) {
|
||||||
resource->gid = malloc(sizeof(char)*strlen(gid->valuestring));
|
resource->gid = malloc(sizeof(char)*strlen(gid->valuestring));
|
||||||
strcpy(resource->gid, gid->valuestring);
|
strcpy(resource->gid, gid->valuestring);
|
||||||
|
fprintf(stderr, "Extracted resource ID %s\n", resource->gid);
|
||||||
} else {
|
} else {
|
||||||
resource->gid = NULL;
|
resource->gid = NULL;
|
||||||
}
|
}
|
||||||
@@ -173,7 +205,7 @@ asana_err user_task_list_gid(char *workspace_gid, char *gid) {
|
|||||||
asana_err user_task_list(char *task_list_gid, Project *task_list) {
|
asana_err user_task_list(char *task_list_gid, Project *task_list) {
|
||||||
asana_err ret = ASANA_ERR_FETCH;
|
asana_err ret = ASANA_ERR_FETCH;
|
||||||
char path[ASANA_URL_MAX_LENGTH];
|
char path[ASANA_URL_MAX_LENGTH];
|
||||||
snprintf(path, ASANA_URL_MAX_LENGTH, "user_task_lists/%s/tasks?limit=100&completed_since=now");
|
snprintf(path, ASANA_URL_MAX_LENGTH, "user_task_lists/%s/tasks?limit=100&completed_since=now", task_list_gid);
|
||||||
|
|
||||||
Response *task_list_resp = asana_fetch(path);
|
Response *task_list_resp = asana_fetch(path);
|
||||||
|
|
||||||
@@ -182,8 +214,8 @@ asana_err user_task_list(char *task_list_gid, Project *task_list) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (task_list_resp->status == 200) {
|
if (task_list_resp->status == 200) {
|
||||||
ret = asana_parse(task_list_resp->body, task_list);
|
task_list->tasks = (Task *)asana_parse_array(task_list_resp->body, sizeof(Task), &(task_list->tasks_len));
|
||||||
// TODO: need to parse top-level arrays
|
ret = task_list->tasks == NULL ? ASANA_ERR_PARSE : ASANA_ERR_OK;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Error fetching user_Task_list: %d\n", task_list_resp->status);
|
fprintf(stderr, "Error fetching user_Task_list: %d\n", task_list_resp->status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,9 +54,13 @@ typedef int asana_err;
|
|||||||
#define ASANA_ERR_PARSE 2
|
#define ASANA_ERR_PARSE 2
|
||||||
#define ASANA_ERR_UNKNOWN_TYPE 3
|
#define ASANA_ERR_UNKNOWN_TYPE 3
|
||||||
|
|
||||||
|
asana_err asana_parse(char *json, void *resource);
|
||||||
|
void **asana_parse_array(char *json, size_t item_size, size_t *items);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parsing methods to take a cJSON object and populate the Asana resource struct
|
* Parsing methods to take a cJSON object and populate the Asana resource struct
|
||||||
*/
|
*/
|
||||||
|
void asana_extract(cJSON *data, void *resource);
|
||||||
void asana_extract_resource(cJSON *json, Resource *resource);
|
void asana_extract_resource(cJSON *json, Resource *resource);
|
||||||
void asana_extract_user(cJSON *json, User *user);
|
void asana_extract_user(cJSON *json, User *user);
|
||||||
void asana_extract_workspace(cJSON *json, Workspace *workspace);
|
void asana_extract_workspace(cJSON *json, Workspace *workspace);
|
||||||
|
|||||||
40
ncac.c
40
ncac.c
@@ -28,6 +28,9 @@ int main(/*int argc, char **argv*/) {
|
|||||||
case 'j':
|
case 'j':
|
||||||
get_me(&curs_x, &curs_y);
|
get_me(&curs_x, &curs_y);
|
||||||
break;
|
break;
|
||||||
|
case 'm':
|
||||||
|
get_my_tasks(&curs_x, &curs_y);
|
||||||
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
finish(SIGTERM);
|
finish(SIGTERM);
|
||||||
break;
|
break;
|
||||||
@@ -94,3 +97,40 @@ void get_me(int *curs_x, int *curs_y) {
|
|||||||
(*curs_y)++;
|
(*curs_y)++;
|
||||||
draw_text(gid, curs_x, curs_y);
|
draw_text(gid, curs_x, curs_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void get_my_tasks(int *curs_x, int *curs_y) {
|
||||||
|
User me;
|
||||||
|
user_info(&me);
|
||||||
|
|
||||||
|
if (me.workspaces == NULL || me.workspaces_len == 0) {
|
||||||
|
fprintf(stderr, "Unable to get workspaces.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char gid[64];
|
||||||
|
gid[0] = '\0';
|
||||||
|
|
||||||
|
if (user_task_list_gid(me.workspaces[me.workspaces_len-1].gid, gid) != ASANA_ERR_OK) {
|
||||||
|
fprintf(stderr, "Unable to get task list ID. %s\n", gid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Project my_tasks;
|
||||||
|
if (user_task_list(gid, &my_tasks) != ASANA_ERR_OK) {
|
||||||
|
fprintf(stderr, "Unable to get task list.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curs_x = 0;
|
||||||
|
*curs_y = 0;
|
||||||
|
|
||||||
|
draw_text("My Tasks", curs_x, curs_y);
|
||||||
|
*curs_x = 0;
|
||||||
|
(*curs_y)+=2;
|
||||||
|
|
||||||
|
for (size_t i=0; i<my_tasks.tasks_len;i++) {
|
||||||
|
draw_text(my_tasks.tasks[i].name, curs_x, curs_y);
|
||||||
|
*curs_x = 0;
|
||||||
|
(*curs_y)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user