38#define OBJECT_HAS_MEMBER_OR_THROW(val, key) \
41 if (!val.HasMember(key)) \
43 throw cryptonote::json::MISSING_KEY(key); \
47#define INSERT_INTO_JSON_OBJECT(jsonVal, doc, key, source) \
48 rapidjson::Value key##Val; \
49 cryptonote::json::toJsonValue(doc, source, key##Val); \
50 jsonVal.AddMember(#key, key##Val, doc.GetAllocator());
52#define GET_FROM_JSON_OBJECT(source, dst, key) \
53 OBJECT_HAS_MEMBER_OR_THROW(source, #key) \
54 decltype(dst) dstVal##key; \
55 cryptonote::json::fromJsonValue(source[#key], dstVal##key); \
73 const char*
what()
const throw()
83 m = std::string(
"Key \"") +
key +
"\" missing from object.";
91 m = std::string(
"Json value has incorrect type, expected: ") + type;
99 m =
"An item failed to convert from json object to native object";
107 m =
"Failed to parse the json request";
111template<
typename Type>
114 return std::is_pod<Type>() && !std::is_integral<Type>();
120typename std::enable_if<is_to_hex<Type>()>::type
toJsonValue(rapidjson::Document& doc,
const Type& pod, rapidjson::Value&
value)
126typename std::enable_if<is_to_hex<Type>()>::type
fromJsonValue(
const rapidjson::Value& val,
Type& t)
142void toJsonValue(rapidjson::Document& doc,
const std::string& i, rapidjson::Value& val);
143void fromJsonValue(
const rapidjson::Value& val, std::string& str);
145void toJsonValue(rapidjson::Document& doc,
bool i, rapidjson::Value& val);
150void fromJsonValue(
const rapidjson::Value& val,
unsigned char& i);
152void fromJsonValue(
const rapidjson::Value& val,
signed char& i);
156void fromJsonValue(
const rapidjson::Value& val,
unsigned short& i);
160void toJsonValue(rapidjson::Document& doc,
const unsigned i, rapidjson::Value& val);
163void toJsonValue(rapidjson::Document& doc,
const int, rapidjson::Value& val);
167void toJsonValue(rapidjson::Document& doc,
const unsigned long long i, rapidjson::Value& val);
168void fromJsonValue(
const rapidjson::Value& val,
unsigned long long& i);
170void toJsonValue(rapidjson::Document& doc,
const long long i, rapidjson::Value& val);
171void fromJsonValue(
const rapidjson::Value& val,
long long& i);
173inline void toJsonValue(rapidjson::Document& doc,
const unsigned long i, rapidjson::Value& val) {
174 toJsonValue(doc,
static_cast<unsigned long long>(i), val);
176void fromJsonValue(
const rapidjson::Value& val,
unsigned long& i);
178inline void toJsonValue(rapidjson::Document& doc,
const long i, rapidjson::Value& val) {
293template <
typename Map>
294typename std::enable_if<sfinae::is_map_like<Map>::value,
void>::type
toJsonValue(rapidjson::Document& doc,
const Map& map, rapidjson::Value& val);
296template <
typename Map>
297typename std::enable_if<sfinae::is_map_like<Map>::value,
void>::type
fromJsonValue(
const rapidjson::Value& val, Map& map);
299template <
typename Vec>
300typename std::enable_if<sfinae::is_vector_like<Vec>::value,
void>::type
toJsonValue(rapidjson::Document& doc,
const Vec &vec, rapidjson::Value& val);
302template <
typename Vec>
303typename std::enable_if<sfinae::is_vector_like<Vec>::value,
void>::type
fromJsonValue(
const rapidjson::Value& val, Vec& vec);
309template <
typename Map>
310typename std::enable_if<sfinae::is_map_like<Map>::value,
void>::type
toJsonValue(rapidjson::Document& doc,
const Map& map, rapidjson::Value& val)
314 auto& al = doc.GetAllocator();
316 for (
const auto& i : map)
322 val.AddMember(k, m, al);
326template <
typename Map>
327typename std::enable_if<sfinae::is_map_like<Map>::value,
void>::type
fromJsonValue(
const rapidjson::Value& val, Map& map)
334 auto itr = val.MemberBegin();
336 while (itr != val.MemberEnd())
338 typename Map::key_type k;
339 typename Map::mapped_type m;
347template <
typename Vec>
348typename std::enable_if<sfinae::is_vector_like<Vec>::value,
void>::type
toJsonValue(rapidjson::Document& doc,
const Vec &vec, rapidjson::Value& val)
352 for (
const auto& t : vec)
356 val.PushBack(v, doc.GetAllocator());
360template <
typename Vec>
361typename std::enable_if<sfinae::is_vector_like<Vec>::value,
void>::type
fromJsonValue(
const rapidjson::Value& val, Vec& vec)
368 for (rapidjson::SizeType i=0; i < val.Size(); i++)
370 typename Vec::value_type v;
void toJsonValue(rapidjson::Document &doc, const std::string &i, rapidjson::Value &val)
constexpr bool is_to_hex()
void fromJsonValue(const rapidjson::Value &val, std::string &str)
Holds cryptonote related classes and helpers.
boost::variant< txin_gen, txin_to_script, txin_to_scripthash, txin_to_key, txin_to_key_public > txin_v
boost::variant< txout_to_script, txout_to_scripthash, txout_to_key, txout_to_key_public > txout_target_v
const GenericPointer< typename T::ValueType > T2 value
const char * what() const
MISSING_KEY(const char *key)
WRONG_TYPE(const char *type)