6 #ifndef BITCOIN_UNIVALUE_INCLUDE_UNIVALUE_H
7 #define BITCOIN_UNIVALUE_INCLUDE_UNIVALUE_H
15 #include <string_view>
16 #include <type_traits>
25 using std::runtime_error::runtime_error;
30 template <
typename Ref,
typename T = std::remove_cv_t<std::remove_reference_t<Ref>>,
31 std::enable_if_t<std::is_
floating_po
int_v<T> ||
32 std::is_same_v<
bool, T> ||
33 std::is_
signed_v<T> || std::is_
unsigned_v<T> ||
34 std::is_constructible_v<std::
string, T>,
38 if constexpr (std::is_floating_point_v<T>) {
40 }
else if constexpr (std::is_same_v<bool, T>) {
42 }
else if constexpr (std::is_signed_v<T>) {
44 }
else if constexpr (std::is_unsigned_v<T>) {
47 setStr(std::string{std::forward<Ref>(
val)});
60 void setStr(std::string str);
70 void getObjMap(std::map<std::string,UniValue>& kv)
const;
71 bool checkObject(
const std::map<std::string,UniValue::VType>& memberTypes)
const;
74 bool exists(
const std::string& key)
const {
size_t i;
return findKey(key, i); }
86 void push_backV(
const std::vector<UniValue>& vec);
94 std::string
write(
unsigned int prettyIndent = 0,
95 unsigned int indentLevel = 0)
const;
97 bool read(
const char *raw,
size_t len);
98 bool read(
const char *raw) {
return read(raw, strlen(raw)); }
99 bool read(std::string_view raw) {
return read(raw.data(), raw.size()); }
108 bool findKey(
const std::string& key,
size_t& retIdx)
const;
109 void writeArray(
unsigned int prettyIndent,
unsigned int indentLevel, std::string& s)
const;
110 void writeObject(
unsigned int prettyIndent,
unsigned int indentLevel, std::string& s)
const;
115 const std::vector<std::string>&
getKeys()
const;
116 const std::vector<UniValue>&
getValues()
const;
117 template <
typename Int>
120 const std::string&
get_str()
const;
136 template <
typename Int>
139 static_assert(std::is_integral<Int>::value);
142 const auto [first_nonmatching, error_condition] = std::from_chars(
val.data(),
val.data() +
val.size(), result);
143 if (first_nonmatching !=
val.data() +
val.size() || error_condition != std::errc{}) {
144 throw std::runtime_error(
"JSON integer out of range");
166 unsigned int& consumed,
const char *raw,
const char *end);
void push_back(UniValue val)
const std::string & get_str() const
UniValue(UniValue::VType type, std::string str={})
bool checkObject(const std::map< std::string, UniValue::VType > &memberTypes) const
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
enum VType getType() const
friend const UniValue & find_value(const UniValue &obj, const std::string &name)
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
const UniValue & get_obj() const
const std::string & getValStr() const
void __pushKV(std::string key, UniValue val)
const std::vector< UniValue > & getValues() const
void pushKVs(UniValue obj)
const std::vector< std::string > & getKeys() const
void setInt(uint64_t val)
std::vector< UniValue > values
bool read(const char *raw)
std::vector< std::string > keys
void checkType(const VType &expected) const
bool findKey(const std::string &key, size_t &retIdx) const
bool read(std::string_view raw)
const UniValue & operator[](const std::string &key) const
const UniValue & get_array() const
bool exists(const std::string &key) const
void setFloat(double val)
void setStr(std::string str)
void pushKV(std::string key, UniValue val)
void setNumStr(std::string str)
void getObjMap(std::map< std::string, UniValue > &kv) const
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
bool read(const char *raw, size_t len)
void push_backV(const std::vector< UniValue > &vec)
const UniValue & find_value(const UniValue &obj, const std::string &name)
enum jtokentype getJsonToken(std::string &tokenVal, unsigned int &consumed, const char *raw, const char *end)
static bool jsonTokenIsValue(enum jtokentype jtt)
static bool json_isspace(int ch)
const char * uvTypeName(UniValue::VType t)
const UniValue NullUniValue