mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-28 21:34:25 +01:00
155 lines
4.6 KiB
C++
155 lines
4.6 KiB
C++
// Copyright 2014 BitPay Inc.
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_UNIVALUE_UNIVALUE_H
|
|
#define BITCOIN_UNIVALUE_UNIVALUE_H
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <map>
|
|
#include <cassert>
|
|
|
|
class UniValue {
|
|
public:
|
|
enum VType { VNULL, VOBJ, VARR, VSTR, VNUM, VBOOL, };
|
|
|
|
UniValue() { typ = VNULL; }
|
|
UniValue(UniValue::VType initialType, const std::string& initialStr = "") {
|
|
typ = initialType;
|
|
val = initialStr;
|
|
}
|
|
UniValue(uint64_t val_) {
|
|
setInt(val_);
|
|
}
|
|
UniValue(int64_t val_) {
|
|
setInt(val_);
|
|
}
|
|
UniValue(int val_) {
|
|
setInt(val_);
|
|
}
|
|
UniValue(double val_) {
|
|
setFloat(val_);
|
|
}
|
|
UniValue(const std::string& val_) {
|
|
setStr(val_);
|
|
}
|
|
UniValue(const char *val_) {
|
|
std::string s(val_);
|
|
setStr(s);
|
|
}
|
|
~UniValue() {}
|
|
|
|
void clear();
|
|
|
|
bool setNull();
|
|
bool setBool(bool val);
|
|
bool setNumStr(const std::string& val);
|
|
bool setInt(uint64_t val);
|
|
bool setInt(int64_t val);
|
|
bool setInt(int val) { return setInt((int64_t)val); }
|
|
bool setFloat(double val);
|
|
bool setStr(const std::string& val);
|
|
bool setArray();
|
|
bool setObject();
|
|
|
|
enum VType getType() const { return typ; }
|
|
std::string getValStr() const { return val; }
|
|
bool empty() const { return (values.size() == 0); }
|
|
|
|
size_t count() const { return values.size(); }
|
|
|
|
bool getBool() const { return isTrue(); }
|
|
bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes);
|
|
const UniValue& operator[](const std::string& key) const;
|
|
const UniValue& operator[](unsigned int index) const;
|
|
bool exists(const std::string& key) const { return (findKey(key) >= 0); }
|
|
|
|
bool isNull() const { return (typ == VNULL); }
|
|
bool isTrue() const { return (typ == VBOOL) && (val == "1"); }
|
|
bool isFalse() const { return (!isTrue()); }
|
|
bool isBool() const { return (typ == VBOOL); }
|
|
bool isStr() const { return (typ == VSTR); }
|
|
bool isNum() const { return (typ == VNUM); }
|
|
bool isArray() const { return (typ == VARR); }
|
|
bool isObject() const { return (typ == VOBJ); }
|
|
|
|
bool push_back(const UniValue& val);
|
|
bool push_back(const std::string& val_) {
|
|
UniValue tmpVal(VSTR, val_);
|
|
return push_back(tmpVal);
|
|
}
|
|
bool push_back(const char *val_) {
|
|
std::string s(val_);
|
|
return push_back(s);
|
|
}
|
|
bool push_backV(const std::vector<UniValue>& vec);
|
|
|
|
bool pushKV(const std::string& key, const UniValue& val);
|
|
bool pushKV(const std::string& key, const std::string& val) {
|
|
UniValue tmpVal(VSTR, val);
|
|
return pushKV(key, tmpVal);
|
|
}
|
|
bool pushKV(const std::string& key, const char *val_) {
|
|
std::string val(val_);
|
|
return pushKV(key, val);
|
|
}
|
|
bool pushKV(const std::string& key, int64_t val) {
|
|
UniValue tmpVal(val);
|
|
return pushKV(key, tmpVal);
|
|
}
|
|
bool pushKV(const std::string& key, uint64_t val) {
|
|
UniValue tmpVal(val);
|
|
return pushKV(key, tmpVal);
|
|
}
|
|
bool pushKV(const std::string& key, int val) {
|
|
UniValue tmpVal((int64_t)val);
|
|
return pushKV(key, tmpVal);
|
|
}
|
|
bool pushKV(const std::string& key, double val) {
|
|
UniValue tmpVal(val);
|
|
return pushKV(key, tmpVal);
|
|
}
|
|
bool pushKVs(const UniValue& obj);
|
|
|
|
std::string write(unsigned int prettyIndent = 0,
|
|
unsigned int indentLevel = 0) const;
|
|
|
|
bool read(const char *raw);
|
|
bool read(const std::string& rawStr) {
|
|
return read(rawStr.c_str());
|
|
}
|
|
|
|
private:
|
|
UniValue::VType typ;
|
|
std::string val; // numbers are stored as C++ strings
|
|
std::vector<std::string> keys;
|
|
std::vector<UniValue> values;
|
|
|
|
int findKey(const std::string& key) const;
|
|
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
|
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
|
};
|
|
|
|
enum jtokentype {
|
|
JTOK_ERR = -1,
|
|
JTOK_NONE = 0, // eof
|
|
JTOK_OBJ_OPEN,
|
|
JTOK_OBJ_CLOSE,
|
|
JTOK_ARR_OPEN,
|
|
JTOK_ARR_CLOSE,
|
|
JTOK_COLON,
|
|
JTOK_COMMA,
|
|
JTOK_KW_NULL,
|
|
JTOK_KW_TRUE,
|
|
JTOK_KW_FALSE,
|
|
JTOK_NUMBER,
|
|
JTOK_STRING,
|
|
};
|
|
|
|
extern enum jtokentype getJsonToken(std::string& tokenVal,
|
|
unsigned int& consumed, const char *raw);
|
|
extern const char *uvTypeName(UniValue::VType t);
|
|
|
|
#endif // BITCOIN_UNIVALUE_UNIVALUE_H
|