#ifndef JSON_H
#define JSON_H

enum json_type {
    JSON_TYPE_NULL,
    JSON_TYPE_BOOL,
    JSON_TYPE_NUMBER,
    JSON_TYPE_STRING,
    JSON_TYPE_ARRAY,
    JSON_TYPE_OBJECT
};

struct json {
    enum json_type type;
    struct string key;

    struct json *parent;
    struct json *next;
    struct json *child_first;
    struct json *child_last;

    union {
        struct string string;
        f64 number;
        b32 boolean;
    } value;
};

struct json_error {
    struct string msg;
    u64 start;
    u64 end;
    struct json_error *next;
};

struct json_error_list {
    u64 count;
    struct json_error *first;
    struct json_error *last;
};

struct json_parse_result {
    struct json *root;
    struct json_error_list errors;
};

struct json_parse_result json_from_string(struct arena *arena, struct string src);

#endif
