2018-04-15 15:09:31 +02:00
|
|
|
#pragma once
|
|
|
|
|
2018-08-10 19:00:14 +02:00
|
|
|
#include "util/RapidJsonSerializeQString.hpp"
|
2018-04-15 15:09:31 +02:00
|
|
|
|
|
|
|
#include <rapidjson/document.h>
|
2018-11-03 13:00:07 +01:00
|
|
|
#include <pajlada/serialize.hpp>
|
2018-04-15 15:09:31 +02:00
|
|
|
|
|
|
|
#include <cassert>
|
2018-05-13 17:51:01 +02:00
|
|
|
#include <string>
|
2018-04-15 15:09:31 +02:00
|
|
|
|
|
|
|
namespace chatterino {
|
|
|
|
namespace rj {
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
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 <typename Type>
|
|
|
|
void set(rapidjson::Value &obj, const char *key, const Type &value,
|
|
|
|
rapidjson::Document::AllocatorType &a)
|
|
|
|
{
|
|
|
|
assert(obj.IsObject());
|
|
|
|
|
2018-11-03 13:00:07 +01:00
|
|
|
addMember(obj, key, pajlada::Serialize<Type>::get(value, a), a);
|
2018-04-15 15:09:31 +02:00
|
|
|
}
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
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<rapidjson::Value &>(value), a);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Type>
|
|
|
|
void set(rapidjson::Document &obj, const char *key, const Type &value)
|
|
|
|
{
|
|
|
|
assert(obj.IsObject());
|
|
|
|
|
|
|
|
auto &a = obj.GetAllocator();
|
|
|
|
|
2018-11-03 13:00:07 +01:00
|
|
|
addMember(obj, key, pajlada::Serialize<Type>::get(value, a), a);
|
2018-04-15 15:09:31 +02:00
|
|
|
}
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
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<rapidjson::Value &>(value), a);
|
2018-06-06 11:42:01 +02:00
|
|
|
}
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
template <typename Type>
|
|
|
|
void add(rapidjson::Value &arr, const Type &value,
|
|
|
|
rapidjson::Document::AllocatorType &a)
|
|
|
|
{
|
|
|
|
assert(arr.IsArray());
|
2018-04-15 15:09:31 +02:00
|
|
|
|
2018-11-03 13:00:07 +01:00
|
|
|
arr.PushBack(pajlada::Serialize<Type>::get(value, a), a);
|
2018-08-15 22:46:20 +02:00
|
|
|
}
|
2018-04-15 15:09:31 +02:00
|
|
|
|
2020-08-08 15:37:22 +02:00
|
|
|
bool checkJsonValue(const rapidjson::Value &obj, const char *key);
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
template <typename Type>
|
|
|
|
bool getSafe(const rapidjson::Value &obj, const char *key, Type &out)
|
|
|
|
{
|
2020-08-08 15:37:22 +02:00
|
|
|
if (!checkJsonValue(obj, key))
|
2018-10-21 13:43:02 +02:00
|
|
|
{
|
2018-08-15 22:46:20 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool error = false;
|
2018-11-03 13:00:07 +01:00
|
|
|
out = pajlada::Deserialize<Type>::get(obj[key], &error);
|
2018-08-15 22:46:20 +02:00
|
|
|
|
|
|
|
return !error;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Type>
|
|
|
|
bool getSafe(const rapidjson::Value &value, Type &out)
|
|
|
|
{
|
|
|
|
bool error = false;
|
2018-11-03 13:00:07 +01:00
|
|
|
out = pajlada::Deserialize<Type>::get(value, &error);
|
2018-08-15 22:46:20 +02:00
|
|
|
|
|
|
|
return !error;
|
|
|
|
}
|
2018-04-15 15:09:31 +02:00
|
|
|
|
2020-08-08 15:37:22 +02:00
|
|
|
bool getSafeObject(rapidjson::Value &obj, const char *key,
|
|
|
|
rapidjson::Value &out);
|
|
|
|
|
2018-08-15 22:46:20 +02:00
|
|
|
std::string stringify(const rapidjson::Value &value);
|
2018-05-13 17:51:01 +02:00
|
|
|
|
2018-04-15 15:09:31 +02:00
|
|
|
} // namespace rj
|
|
|
|
} // namespace chatterino
|