bool VarValue::operator==(const VarValue& v) const { if (type() != v.type()) return false; switch (type()) { case VarType::Null: return true; case VarType::Bool: return ToBool() == v.ToBool(); case VarType::Int: return ToInt64() == v.ToInt64(); case VarType::Float: return ToDouble() == v.ToDouble(); case VarType::String: return ToString() == v.ToString(); case VarType::Array: if (size() != v.size()) return false; for (int i=0; i<size(); ++i) if (_self[i] != v[i]) return false; return true; case VarType::Map: { if (size() != v.size()) return false; vector<String> keys = Keys(); for (int i=0; i<keys.size(); ++i) { const String& key = keys[i]; if (!v.HasKey(key) || _self[key] != v[key]) return false; } return true; } default: Throw(E_NOTIMPL); } }
TxInfo ToTxInfo(const VarValue& v) { TxInfo r; if (VarValue vAddress = v["address"]) r.Address = vAddress.ToString(); r.HashTx = HashValue(v["txid"].ToString()); r.Confirmations = int32_t(v["confirmations"].ToInt64()); r.Timestamp = DateTime::from_time_t(v["time"].ToInt64()); if (r.Confirmations) { r.HashBlock = HashValue(v["blockhash"].ToString()); } r.Amount = AmountToDecimal(v["amount"]); r.Generated = v.HasKey("generated") && v["generated"].ToBool(); if (VarValue vDetails = v["details"]) { for (size_t i=0; i<vDetails.size(); ++i) { VarValue vd = vDetails[i]; TxInfo::TxDetails d; d.Account = vd["account"].ToString(); d.Address = vd["address"].ToString(); d.IsSend = vd["category"].ToString() == "send"; d.Amount = AmountToDecimal(vd["amount"]); r.Details.push_back(d); } } return r; }