#pragma once #include "util/RapidJsonSerializeQString.hpp" #include #include #include #include namespace chatterino { namespace rj { void addMember(rapidjson::Value &obj, const char *key, rapidjson::Value &&value, rapidjson::Document::AllocatorType &a); void addMember(rapidjson::Value &obj, const char *key, rapidjson::Value &value, rapidjson::Document::AllocatorType &a); template void set(rapidjson::Value &obj, const char *key, const Type &value, rapidjson::Document::AllocatorType &a) { assert(obj.IsObject()); addMember(obj, key, pajlada::Serialize::get(value, a), a); } template <> inline void set(rapidjson::Value &obj, const char *key, const rapidjson::Value &value, rapidjson::Document::AllocatorType &a) { assert(obj.IsObject()); addMember(obj, key, const_cast(value), a); } template void set(rapidjson::Document &obj, const char *key, const Type &value) { assert(obj.IsObject()); auto &a = obj.GetAllocator(); addMember(obj, key, pajlada::Serialize::get(value, a), a); } template <> inline void set(rapidjson::Document &obj, const char *key, const rapidjson::Value &value) { assert(obj.IsObject()); auto &a = obj.GetAllocator(); addMember(obj, key, const_cast(value), a); } template void add(rapidjson::Value &arr, const Type &value, rapidjson::Document::AllocatorType &a) { assert(arr.IsArray()); arr.PushBack(pajlada::Serialize::get(value, a), a); } template bool getSafe(const rapidjson::Value &obj, const char *key, Type &out) { if (!obj.IsObject()) { return false; } if (!obj.HasMember(key)) { return false; } if (obj.IsNull()) { return false; } bool error = false; out = pajlada::Deserialize::get(obj[key], &error); return !error; } template bool getSafe(const rapidjson::Value &value, Type &out) { bool error = false; out = pajlada::Deserialize::get(value, &error); return !error; } std::string stringify(const rapidjson::Value &value); } // namespace rj } // namespace chatterino