2018-01-06 22:59:05 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "serializer.h"
|
|
|
|
|
|
|
|
#include <rapidjson/document.h>
|
|
|
|
#include <rapidjson/prettywriter.h>
|
|
|
|
|
|
|
|
class JsonReader : public Reader {
|
|
|
|
rapidjson::GenericValue<rapidjson::UTF8<>>* m_;
|
2018-01-19 06:47:44 +00:00
|
|
|
std::vector<const char*> path_;
|
2018-01-06 22:59:05 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m) {}
|
2018-01-07 00:22:46 +00:00
|
|
|
SerializeFormat Format() const override { return SerializeFormat::Json; }
|
2018-01-06 22:59:05 +00:00
|
|
|
|
2018-01-19 06:47:44 +00:00
|
|
|
bool IsBool() override { return m_->IsBool(); }
|
2018-01-06 22:59:05 +00:00
|
|
|
bool IsNull() override { return m_->IsNull(); }
|
|
|
|
bool IsInt() override { return m_->IsInt(); }
|
2018-01-11 07:16:33 +00:00
|
|
|
bool IsInt64() override { return m_->IsInt64(); }
|
2018-01-19 06:47:44 +00:00
|
|
|
bool IsUint64() override { return m_->IsUint64(); }
|
|
|
|
bool IsDouble() override { return m_->IsDouble(); }
|
2018-01-06 22:59:05 +00:00
|
|
|
bool IsString() override { return m_->IsString(); }
|
|
|
|
|
2018-01-08 04:10:16 +00:00
|
|
|
void GetNull() override {}
|
2018-01-06 22:59:05 +00:00
|
|
|
bool GetBool() override { return m_->GetBool(); }
|
|
|
|
int GetInt() override { return m_->GetInt(); }
|
2018-01-18 08:43:06 +00:00
|
|
|
uint32_t GetUint32() override { return uint32_t(m_->GetUint64()); }
|
2018-01-06 22:59:05 +00:00
|
|
|
int64_t GetInt64() override { return m_->GetInt64(); }
|
|
|
|
uint64_t GetUint64() override { return m_->GetUint64(); }
|
2018-01-10 06:34:58 +00:00
|
|
|
double GetDouble() override { return m_->GetDouble(); }
|
2018-01-07 05:08:25 +00:00
|
|
|
std::string GetString() override { return m_->GetString(); }
|
2018-01-06 22:59:05 +00:00
|
|
|
|
|
|
|
bool HasMember(const char* x) override { return m_->HasMember(x); }
|
|
|
|
std::unique_ptr<Reader> operator[](const char* x) override {
|
|
|
|
auto& sub = (*m_)[x];
|
|
|
|
return std::unique_ptr<JsonReader>(new JsonReader(&sub));
|
|
|
|
}
|
|
|
|
|
|
|
|
void IterArray(std::function<void(Reader&)> fn) override {
|
2018-01-19 06:47:44 +00:00
|
|
|
if (!m_->IsArray())
|
|
|
|
throw std::invalid_argument("array");
|
|
|
|
// Use "0" to indicate any element for now.
|
|
|
|
path_.push_back("0");
|
2018-01-06 22:59:05 +00:00
|
|
|
for (auto& entry : m_->GetArray()) {
|
2018-01-19 23:33:32 +00:00
|
|
|
auto saved = m_;
|
|
|
|
m_ = &entry;
|
|
|
|
fn(*this);
|
|
|
|
m_ = saved;
|
2018-01-06 22:59:05 +00:00
|
|
|
}
|
2018-01-19 06:47:44 +00:00
|
|
|
path_.pop_back();
|
2018-01-06 22:59:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DoMember(const char* name, std::function<void(Reader&)> fn) override {
|
2018-01-19 06:47:44 +00:00
|
|
|
path_.push_back(name);
|
2018-01-06 22:59:05 +00:00
|
|
|
auto it = m_->FindMember(name);
|
|
|
|
if (it != m_->MemberEnd()) {
|
2018-01-19 23:33:32 +00:00
|
|
|
auto saved = m_;
|
|
|
|
m_ = &it->value;
|
|
|
|
fn(*this);
|
|
|
|
m_ = saved;
|
2018-01-06 22:59:05 +00:00
|
|
|
}
|
2018-01-19 06:47:44 +00:00
|
|
|
path_.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string GetPath() const {
|
|
|
|
std::string ret;
|
|
|
|
for (auto& t : path_) {
|
|
|
|
ret += '/';
|
|
|
|
ret += t;
|
|
|
|
}
|
|
|
|
ret.pop_back();
|
|
|
|
return ret;
|
2018-01-06 22:59:05 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class JsonWriter : public Writer {
|
|
|
|
rapidjson::Writer<rapidjson::StringBuffer>* m_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m) {}
|
2018-01-07 00:22:46 +00:00
|
|
|
SerializeFormat Format() const override { return SerializeFormat::Json; }
|
2018-01-06 22:59:05 +00:00
|
|
|
|
|
|
|
void Null() override { m_->Null(); }
|
|
|
|
void Bool(bool x) override { m_->Bool(x); }
|
|
|
|
void Int(int x) override { m_->Int(x); }
|
2018-01-18 08:43:06 +00:00
|
|
|
void Uint32(uint32_t x) override { m_->Uint64(x); }
|
2018-01-06 22:59:05 +00:00
|
|
|
void Int64(int64_t x) override { m_->Int64(x); }
|
|
|
|
void Uint64(uint64_t x) override { m_->Uint64(x); }
|
2018-01-10 06:34:58 +00:00
|
|
|
void Double(double x) override { m_->Double(x); }
|
2018-01-06 22:59:05 +00:00
|
|
|
void String(const char* x) override { m_->String(x); }
|
|
|
|
void String(const char* x, size_t len) override { m_->String(x, len); }
|
2018-01-07 00:22:46 +00:00
|
|
|
void StartArray(size_t) override { m_->StartArray(); }
|
2018-01-06 22:59:05 +00:00
|
|
|
void EndArray() override { m_->EndArray(); }
|
2018-01-08 04:10:16 +00:00
|
|
|
void StartObject() override { m_->StartObject(); }
|
2018-01-06 22:59:05 +00:00
|
|
|
void EndObject() override { m_->EndObject(); }
|
|
|
|
void Key(const char* name) override { m_->Key(name); }
|
|
|
|
};
|