+char **json_to_tags(struct json_object *jtask)
+{
+ struct json_object *jtags, *jtag;
+ char **tags;
+ int n, i;
+
+ jtags = json_object_object_get(jtask, "tags");
+
+ if (!jtags)
+ return NULL;
+
+
+ n = json_object_array_length(jtags);
+
+ tags = malloc((n + 1) * sizeof(char *));
+
+ for (i = 0; i < n; i++) {
+ jtag = json_object_array_get_idx(jtags, i);
+ tags[i] = strdup(json_object_get_string(jtag));
+ }
+
+ tags[n] = NULL;
+
+ return tags;
+}
+
+struct task *json_to_task(struct json_object *jtask)
+{
+ struct task *task;
+ const char *urg;
+ struct json_object *json;
+
+ task = malloc(sizeof(struct task));
+
+ json = json_object_object_get(jtask, "id");
+ task->id = json_object_get_int(json);
+
+ json = json_object_object_get(jtask, "description");
+ task->description = strdup(json_object_get_string(json));
+
+ json = json_object_object_get(jtask, "status");
+ task->status = strdup(json_object_get_string(json));
+
+ json = json_object_object_get(jtask, "project");
+ if (json)
+ task->project
+ = strdup(json_object_get_string(json));
+ else
+ task->project = strdup("");
+
+ json = json_object_object_get(jtask, "priority");
+ if (json)
+ task->priority
+ = strdup(json_object_get_string(json));
+ else
+ task->priority = strdup("");
+
+ json = json_object_object_get(jtask, "uuid");
+ task->uuid = strdup(json_object_get_string(json));
+
+ json = json_object_object_get(jtask, "urgency");
+ urg = json_object_get_string(json);
+ if (urg)
+ task->urgency = strdup(urg);
+ else
+ task->urgency = NULL;
+
+ task->note = note_get(task->uuid);
+
+ json = json_object_object_get(jtask, "entry");
+ task->entry = parse_time(json_object_get_string(json));
+
+ json = json_object_object_get(jtask, "due");
+ if (json)
+ task->due
+ = parse_time(json_object_get_string(json));
+ else
+ task->due = NULL;
+
+ json = json_object_object_get(jtask, "start");
+ if (json)
+ task->start
+ = parse_time(json_object_get_string(json));
+ else
+ task->start = NULL;
+
+ json = json_object_object_get(jtask, "recur");
+ if (json)
+ task->recur = strdup(json_object_get_string(json));
+ else
+ task->recur = NULL;
+
+ task->tags = json_to_tags(jtask);
+
+ return task;
+}
+