mirror-chatterino2/src/util/RapidjsonHelpers.hpp

102 lines
2.7 KiB
C++
Raw Normal View History

#pragma once
2018-08-10 19:00:14 +02:00
#include "util/RapidJsonSerializeQString.hpp"
#include <pajlada/serialize.hpp>
#include <rapidjson/document.h>
#include <cassert>
#include <string>
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());
addMember(obj, key, pajlada::Serialize<Type>::get(value, a), a);
}
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();
addMember(obj, key, pajlada::Serialize<Type>::get(value, a), a);
}
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-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());
arr.PushBack(pajlada::Serialize<Type>::get(value, a), a);
2018-08-15 22:46:20 +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)
{
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;
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;
out = pajlada::Deserialize<Type>::get(value, &error);
2018-08-15 22:46:20 +02:00
return !error;
}
bool getSafeObject(rapidjson::Value &obj, const char *key,
rapidjson::Value &out);
QString stringify(const rapidjson::Value &value);
} // namespace rj
} // namespace chatterino