class tool_json
{
public:
static bool try_get_iter(const char* key, const rapidjson::Value& node,
rapidjson::Value::ConstMemberIterator& out_iter)
{
if(node.IsObject())
{
out_iter = node.FindMember(key);
if(node.MemberEnd() == out_iter)
{
return false;
}
return true;
}
return false;
}
static bool try_get_value(int& d, const char* key, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsInt())
{
d = iter->value.GetInt();
return true;
}
}
return false;
}
static bool try_get_value(uint64_t& d, const char* key, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsUint64())
{
d = iter->value.GetUint64();
return true;
}
}
return false;
}
static bool try_get_value(double& d, const char* key, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsDouble())
{
d = iter->value.GetDouble();
return true;
}
}
return false;
}
static bool try_get_value(std::string& d, const char* key, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsString())
{
d = iter->value.GetString();
return true;
}
}
return false;
}
static int get_value(const char* key, const int& default_data, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsInt())
{
return iter->value.GetInt();
}
}
return default_data;
}
static std::string get_value(const char* key, const std::string& default_data, const rapidjson::Value& node)
{
rapidjson::Value::ConstMemberIterator iter;
if(try_get_iter(key, node, iter))
{
if(iter->value.IsString())
{
return iter->value.GetString();
}
}
return default_data;
}
static std::string doc_to_json(rapidjson::Document& doc)
{
rapidjson::StringBuffer sb;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
doc.Accept(writer);
return sb.GetString();
}
};