summaryrefslogtreecommitdiff
path: root/src/json.hh
blob: 6765c793f3580fa2c965a2cba13a520f0d8b7b38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef json_hh_INCLUDED
#define json_hh_INCLUDED

#include "hash_map.hh"
#include "string.hh"
#include "string_utils.hh"
#include "value.hh"

namespace Kakoune
{

using JsonArray = Vector<Value>;
using JsonObject = HashMap<String, Value>;

String to_json(int i);
String to_json(bool b);
String to_json(StringView str);

template<typename T>
String to_json(ArrayView<const T> array)
{
    return "[" + join(array | transform([](auto&& elem) { return to_json(elem); }), ", ") + "]";
}

template<typename T, MemoryDomain D>
String to_json(const Vector<T, D>& vec) { return to_json(ArrayView<const T>{vec}); }

template<typename K, typename V, MemoryDomain D>
String to_json(const HashMap<K, V, D>& map)
{
    return "{" + join(map | transform([](auto&& i) { return format("{}: {}", to_json(i.key), to_json(i.value)); }),
                      ',', false) + "}";
}

struct JsonResult { Value value; const char* new_pos; };

JsonResult parse_json(const char* pos, const char* end);
JsonResult parse_json(StringView json);

}

#endif // json_hh_INCLUDED