diff options
Diffstat (limited to 'src/account.c')
-rw-r--r-- | src/account.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/account.c b/src/account.c new file mode 100644 index 0000000..c407d56 --- /dev/null +++ b/src/account.c @@ -0,0 +1,92 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <string.h> +#include <jansson.h> +#include "account.h" +#include "log.h" + +struct account *account_from_json(const char *json_data) +{ + struct account *a; + json_t *root; + json_error_t error; + + root = json_loads(json_data, 0, &error); + if (!root) { + log_msg(LOG_WARNING, "account_from_json", "json parse error: line %d: %s", + error.line, error.text); + return NULL; + } + + a = account_from_json_t(root); + json_decref(root); + return a; +} + +struct account *account_from_json_t(const json_t *root) +{ + struct account *a; + if (!root) { + log_msg(LOG_WARNING, "account_from_json_t", "json data is null"); + return NULL; + } + + if (!json_is_object(root)) { + log_msg(LOG_WARNING, "account_from_json_t", "json root is not object"); + return NULL; + } + + a = calloc(1, sizeof(struct account)); + if (!a) { + err(1, "account_from_json_t"); + return NULL; + } + + json_t *id = json_object_get(root, "id"); + if (json_is_string(id)) { + a->id = strdup(json_string_value(id)); + } + + json_t *username = json_object_get(root, "username"); + if (json_is_string(username)) { + a->username = strdup(json_string_value(username)); + } + + json_t *acct = json_object_get(root, "acct"); + if (json_is_string(acct)) { + a->acct = strdup(json_string_value(acct)); + } + + json_t *display_name = json_object_get(root, "display_name"); + if (json_is_string(display_name)) { + a->display_name = strdup(json_string_value(display_name)); + } + + return a; +} + +void account_free(struct account *a) +{ + if (a->id) + free(a->id); + if (a->username) + free(a->username); + if (a->acct) + free(a->acct); + if (a->display_name) + free(a->display_name); + if (a->note) + free(a->note); + if (a->url) + free(a->url); + if (a->avatar) + free(a->avatar); + if (a->avatar_static) + free(a->avatar_static); + if (a->header) + free(a->header); + if (a->header_static) + free(a->header_static); + free(a); +} + |