7cdbe1d3d2
The `json_ui.cc` file contained both data-parsing and UI-related code. This commit moves the JSON parsing code to its own `json.cc` file, to separate concerns, make compilation faster when changes are made to either UI or parsing code, and make the parsing code more accessible to fuzzers. The signature of the following function: ``` auto parse_json(StringView json); ``` was changed to: ``` JsonResult parse_json(StringView json); ``` to avoid `auto` deduction issues at compile-time.
42 lines
1022 B
C++
42 lines
1022 B
C++
#ifndef json_hh_INCLUDED
|
|
#define json_hh_INCLUDED
|
|
|
|
#include "hash_map.hh"
|
|
#include "string.hh"
|
|
#include "value.hh"
|
|
|
|
namespace Kakoune
|
|
{
|
|
|
|
using JsonArray = Vector<Value>;
|
|
using JsonObject = HashMap<String, Value>;
|
|
|
|
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) + "}";
|
|
}
|
|
|
|
String to_json(int i);
|
|
String to_json(bool b);
|
|
String to_json(StringView str);
|
|
|
|
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
|