Replace StatusObject with underlying JSON type

pull/780/head
Michael 5 years ago
parent bbeb5480d6
commit 094b697b01
No known key found for this signature in database
GPG Key ID: 2D51757B47E2434C

@ -30,7 +30,7 @@ namespace llarp
util::StatusObject obj{}; util::StatusObject obj{};
for(const auto& item : nodes) for(const auto& item : nodes)
{ {
obj.Put(item.first.ToHex(), item.second.ExtractStatus()); obj[item.first.ToHex()] = item.second.ExtractStatus();
} }
return obj; return obj;
} }

@ -50,12 +50,12 @@ namespace llarp
return item.ExtractStatus(); return item.ExtractStatus();
}); });
obj.Put("found", foundObjs); obj["found"] = foundObjs;
std::vector< std::string > asked; std::vector< std::string > asked;
std::transform( std::transform(
peersAsked.begin(), peersAsked.end(), std::back_inserter(asked), peersAsked.begin(), peersAsked.end(), std::back_inserter(asked),
[](const auto& item) -> std::string { return item.ToHex(); }); [](const auto& item) -> std::string { return item.ToHex(); });
obj.Put("asked", asked); obj["asked"] = asked;
return obj; return obj;
} }

@ -40,14 +40,14 @@ namespace llarp
{"owner", item.first.ExtractStatus()}, {"owner", item.first.ExtractStatus()},
{"tx", item.second->ExtractStatus()}}; {"tx", item.second->ExtractStatus()}};
}); });
obj.Put("tx", txObjs); obj["tx"] = txObjs;
std::transform( std::transform(
timeouts.begin(), timeouts.end(), std::back_inserter(timeoutsObjs), timeouts.begin(), timeouts.end(), std::back_inserter(timeoutsObjs),
[](const auto& item) -> util::StatusObject { [](const auto& item) -> util::StatusObject {
return util::StatusObject{{"time", item.second}, return util::StatusObject{{"time", item.second},
{"target", item.first.ToHex()}}; {"target", item.first.ToHex()}};
}); });
obj.Put("timeouts", timeoutsObjs); obj["timeouts"] = timeoutsObjs;
std::transform(waiting.begin(), waiting.end(), std::transform(waiting.begin(), waiting.end(),
std::back_inserter(waitingObjs), std::back_inserter(waitingObjs),
[](const auto& item) -> util::StatusObject { [](const auto& item) -> util::StatusObject {
@ -55,7 +55,7 @@ namespace llarp
{"target", item.first.ToHex()}, {"target", item.first.ToHex()},
{"whoasked", item.second.ExtractStatus()}}; {"whoasked", item.second.ExtractStatus()}};
}); });
obj.Put("waiting", waitingObjs); obj["waiting"] = waitingObjs;
return obj; return obj;
} }

@ -52,7 +52,7 @@ namespace llarp
auto itr = m_Exits.begin(); auto itr = m_Exits.begin();
while(itr != m_Exits.end()) while(itr != m_Exits.end())
{ {
obj.Put(itr->first, itr->second->ExtractStatus()); obj[itr->first] = itr->second->ExtractStatus();
++itr; ++itr;
} }
return obj; return obj;

@ -37,10 +37,10 @@ namespace llarp
util::StatusObject util::StatusObject
BaseSession::ExtractStatus() const BaseSession::ExtractStatus() const
{ {
auto obj = path::Builder::ExtractStatus(); auto obj = path::Builder::ExtractStatus();
obj.Put("lastExitUse", m_LastUse); obj["lastExitUse"] = m_LastUse;
auto pub = m_ExitIdentity.toPublic(); auto pub = m_ExitIdentity.toPublic();
obj.Put("exitIdentity", pub.ToString()); obj["exitIdentity"] = pub.ToString();
return obj; return obj;
} }

@ -51,9 +51,9 @@ namespace llarp
util::StatusObject exitsObj{}; util::StatusObject exitsObj{};
for(const auto &item : m_ActiveExits) for(const auto &item : m_ActiveExits)
{ {
exitsObj.Put(item.first.ToHex(), item.second->ExtractStatus()); exitsObj[item.first.ToHex()] = item.second->ExtractStatus();
} }
obj.Put("exits", exitsObj); obj["exits"] = exitsObj;
return obj; return obj;
} }

@ -66,14 +66,14 @@ namespace llarp
util::StatusObject util::StatusObject
TunEndpoint::ExtractStatus() const TunEndpoint::ExtractStatus() const
{ {
auto obj = service::Endpoint::ExtractStatus(); auto obj = service::Endpoint::ExtractStatus();
obj.Put("ifaddr", m_OurRange.ToString()); obj["ifaddr"] = m_OurRange.ToString();
std::vector< std::string > resolvers; std::vector< std::string > resolvers;
for(const auto &addr : m_UpstreamResolvers) for(const auto &addr : m_UpstreamResolvers)
resolvers.emplace_back(addr.ToString()); resolvers.emplace_back(addr.ToString());
obj.Put("ustreamResolvers", resolvers); obj["ustreamResolvers"] = resolvers;
obj.Put("localResolver", m_LocalResolverAddr.ToString()); obj["localResolver"] = m_LocalResolverAddr.ToString();
util::StatusObject ips{}; util::StatusObject ips{};
for(const auto &item : m_IPActivity) for(const auto &item : m_IPActivity)
{ {
@ -84,14 +84,14 @@ namespace llarp
remoteStr = RouterID(addr.as_array()).ToString(); remoteStr = RouterID(addr.as_array()).ToString();
else else
remoteStr = service::Address(addr.as_array()).ToString(); remoteStr = service::Address(addr.as_array()).ToString();
ipObj.Put("remote", remoteStr); ipObj["remote"] = remoteStr;
std::string ipaddr = item.first.ToString(); std::string ipaddr = item.first.ToString();
ips.Put(ipaddr.c_str(), ipObj); ips[ipaddr] = ipObj;
} }
obj.Put("addrs", ips); obj["addrs"] = ips;
obj.Put("ourIP", m_OurIP.ToString()); obj["ourIP"] = m_OurIP.ToString();
obj.Put("nextIP", m_NextIP.ToString()); obj["nextIP"] = m_NextIP.ToString();
obj.Put("maxIP", m_MaxIP.ToString()); obj["maxIP"] = m_MaxIP.ToString();
return obj; return obj;
} }

@ -18,11 +18,6 @@ namespace llarp
struct IOutboundSessionMaker; struct IOutboundSessionMaker;
struct RouterID; struct RouterID;
namespace util
{
struct StatusObject;
} // namespace util
struct ILinkManager struct ILinkManager
{ {
virtual ~ILinkManager() = default; virtual ~ILinkManager() = default;

@ -272,30 +272,30 @@ namespace llarp
[](const auto& hop) -> util::StatusObject { [](const auto& hop) -> util::StatusObject {
return hop.ExtractStatus(); return hop.ExtractStatus();
}); });
obj.Put("hops", hopsObj); obj["hops"] = hopsObj;
switch(_status) switch(_status)
{ {
case ePathBuilding: case ePathBuilding:
obj.Put("status", "building"); obj["status"] = "building";
break; break;
case ePathEstablished: case ePathEstablished:
obj.Put("status", "established"); obj["status"] = "established";
break; break;
case ePathTimeout: case ePathTimeout:
obj.Put("status", "timeout"); obj["status"] = "timeout";
break; break;
case ePathExpired: case ePathExpired:
obj.Put("status", "expired"); obj["status"] = "expired";
break; break;
case ePathFailed: case ePathFailed:
obj.Put("status", "failed"); obj["status"] = "failed";
break; break;
case ePathIgnore: case ePathIgnore:
obj.Put("status", "ignored"); obj["status"] = "ignored";
break; break;
default: default:
obj.Put("status", "unknown"); obj["status"] = "unknown";
break; break;
} }
return obj; return obj;

@ -186,13 +186,11 @@ namespace llarp
util::StatusObject obj{{"buildStats", m_BuildStats.ExtractStatus()}, util::StatusObject obj{{"buildStats", m_BuildStats.ExtractStatus()},
{"numHops", uint64_t(numHops)}, {"numHops", uint64_t(numHops)},
{"numPaths", uint64_t(numPaths)}}; {"numPaths", uint64_t(numPaths)}};
std::vector< util::StatusObject > pathObjs;
std::transform(m_Paths.begin(), m_Paths.end(), std::transform(m_Paths.begin(), m_Paths.end(),
std::back_inserter(pathObjs), std::back_inserter(obj["paths"]),
[](const auto& item) -> util::StatusObject { [](const auto& item) -> util::StatusObject {
return item.second->ExtractStatus(); return item.second->ExtractStatus();
}); });
obj.Put("paths", pathObjs);
return obj; return obj;
} }

@ -1,6 +1,8 @@
#ifndef LLARP_ROUTER_I_OUTBOUND_MESSAGE_HANDLER_HPP #ifndef LLARP_ROUTER_I_OUTBOUND_MESSAGE_HANDLER_HPP
#define LLARP_ROUTER_I_OUTBOUND_MESSAGE_HANDLER_HPP #define LLARP_ROUTER_I_OUTBOUND_MESSAGE_HANDLER_HPP
#include <util/status.hpp>
#include <cstdint> #include <cstdint>
#include <functional> #include <functional>
@ -19,11 +21,6 @@ namespace llarp
struct ILinkMessage; struct ILinkMessage;
struct RouterID; struct RouterID;
namespace util
{
struct StatusObject;
}
using SendStatusHandler = std::function< void(SendStatus) >; using SendStatusHandler = std::function< void(SendStatus) >;
struct IOutboundMessageHandler struct IOutboundMessageHandler

@ -1,17 +1,13 @@
#ifndef LLARP_ROUTER_I_OUTBOUND_SESSION_MAKER_HPP #ifndef LLARP_ROUTER_I_OUTBOUND_SESSION_MAKER_HPP
#define LLARP_ROUTER_I_OUTBOUND_SESSION_MAKER_HPP #define LLARP_ROUTER_I_OUTBOUND_SESSION_MAKER_HPP
#include <util/status.hpp>
#include <util/types.hpp> #include <util/types.hpp>
#include <functional> #include <functional>
namespace llarp namespace llarp
{ {
namespace util
{
struct StatusObject;
} // namespace util
struct ILinkSession; struct ILinkSession;
struct RouterID; struct RouterID;
struct RouterContact; struct RouterContact;

@ -110,13 +110,11 @@ namespace llarp
util::StatusObject util::StatusObject
Router::ExtractStatus() const Router::ExtractStatus() const
{ {
util::StatusObject obj{{"dht", _dht->impl->ExtractStatus()}, return util::StatusObject{
{"services", _hiddenServiceContext.ExtractStatus()}, {"dht", _dht->impl->ExtractStatus()},
{"exit", _exitContext.ExtractStatus()}}; {"services", _hiddenServiceContext.ExtractStatus()},
{"exit", _exitContext.ExtractStatus()},
obj.Put("links", _linkManager.ExtractStatus()); {"links", _linkManager.ExtractStatus()}};
return obj;
} }
bool bool

@ -165,7 +165,7 @@ namespace llarp
{"publicRouter", IsPublicRouter()}, {"publicRouter", IsPublicRouter()},
{"identity", pubkey.ToHex()}}; {"identity", pubkey.ToHex()}};
if(HasNick()) if(HasNick())
obj.Put("nickname", Nick()); obj["nickname"] = Nick();
return obj; return obj;
} }

@ -111,7 +111,7 @@ namespace llarp
nlohmann::json nlohmann::json
ToJson() const ToJson() const
{ {
return ExtractStatus().get(); return ExtractStatus();
} }
bool bool

@ -197,8 +197,7 @@ namespace llarp
Response Response
DumpState() const DumpState() const
{ {
const util::StatusObject dump = router->ExtractStatus(); return router->ExtractStatus();
return dump.get();
} }
Response Response

@ -71,7 +71,7 @@ namespace llarp
auto itr = m_Endpoints.begin(); auto itr = m_Endpoints.begin();
while(itr != m_Endpoints.end()) while(itr != m_Endpoints.end())
{ {
obj.Put(itr->first, itr->second->ExtractStatus()); obj[itr->first] = itr->second->ExtractStatus();
++itr; ++itr;
} }
return obj; return obj;

@ -162,8 +162,8 @@ namespace llarp
util::StatusObject util::StatusObject
Endpoint::ExtractStatus() const Endpoint::ExtractStatus() const
{ {
auto obj = path::Builder::ExtractStatus(); auto obj = path::Builder::ExtractStatus();
obj.Put("identity", m_Identity.pub.Addr().ToString()); obj["identity"] = m_Identity.pub.Addr().ToString();
return m_state->ExtractStatus(obj); return m_state->ExtractStatus(obj);
} }

@ -116,31 +116,40 @@ namespace llarp
util::StatusObject util::StatusObject
EndpointState::ExtractStatus(util::StatusObject& obj) const EndpointState::ExtractStatus(util::StatusObject& obj) const
{ {
obj.Put("lastPublished", m_LastPublish); obj["lastPublished"] = m_LastPublish;
obj.Put("lastPublishAttempt", m_LastPublishAttempt); obj["lastPublishAttempt"] = m_LastPublishAttempt;
obj.Put("introset", m_IntroSet.ExtractStatus()); obj["introset"] = m_IntroSet.ExtractStatus();
if(!m_Tag.IsZero()) if(!m_Tag.IsZero())
obj.Put("tag", m_Tag.ToString());
static auto getSecond = [](const auto& item) -> const auto&
{ {
return item.second; obj["tag"] = m_Tag.ToString();
}
static auto getSecond = [](const auto& item) -> auto
{
return item.second->ExtractStatus();
}; };
obj.PutContainer("deadSessions", m_DeadSessions, getSecond);
obj.PutContainer("remoteSessions", m_RemoteSessions, getSecond); std::transform(m_DeadSessions.begin(), m_DeadSessions.end(),
obj.PutContainer("lookups", m_PendingLookups, getSecond); std::back_inserter(obj["deadSessions"]), getSecond);
obj.PutContainer("snodeSessions", m_SNodeSessions, std::transform(m_RemoteSessions.begin(), m_RemoteSessions.end(),
[](const auto& item) { return item.second.first; }); std::back_inserter(obj["remoteSessions"]), getSecond);
std::transform(m_PendingLookups.begin(), m_PendingLookups.end(),
std::back_inserter(obj["lookups"]), getSecond);
std::transform(
m_SNodeSessions.begin(), m_SNodeSessions.end(),
std::back_inserter(obj["snodeSessions"]),
[](const auto& item) { return item.second.first->ExtractStatus(); });
util::StatusObject sessionObj{}; util::StatusObject sessionObj{};
for(const auto& item : m_Sessions) for(const auto& item : m_Sessions)
{ {
std::string k = item.first.ToHex(); std::string k = item.first.ToHex();
sessionObj.Put(k, item.second.ExtractStatus()); sessionObj[k] = item.second.ExtractStatus();
} }
obj.Put("converstations", sessionObj); obj["converstations"] = sessionObj;
return obj; return obj;
} }
} // namespace service } // namespace service

@ -15,9 +15,9 @@ namespace llarp
[](const auto& intro) -> util::StatusObject { [](const auto& intro) -> util::StatusObject {
return intro.ExtractStatus(); return intro.ExtractStatus();
}); });
obj.Put("intros", introsObjs); obj["intros"] = introsObjs;
if(!topic.IsZero()) if(!topic.IsZero())
obj.Put("topic", topic.ToString()); obj["topic"] = topic.ToString();
return obj; return obj;
} }

@ -213,27 +213,25 @@ namespace llarp
util::StatusObject util::StatusObject
OutboundContext::ExtractStatus() const OutboundContext::ExtractStatus() const
{ {
auto obj = path::Builder::ExtractStatus(); auto obj = path::Builder::ExtractStatus();
obj.Put("currentConvoTag", currentConvoTag.ToHex()); obj["currentConvoTag"] = currentConvoTag.ToHex();
obj.Put("remoteIntro", remoteIntro.ExtractStatus()); obj["remoteIntro"] = remoteIntro.ExtractStatus();
obj.Put("sessionCreatedAt", createdAt); obj["sessionCreatedAt"] = createdAt;
obj.Put("lastGoodSend", lastGoodSend); obj["lastGoodSend"] = lastGoodSend;
obj.Put("seqno", sequenceNo); obj["seqno"] = sequenceNo;
obj.Put("markedBad", markedBad); obj["markedBad"] = markedBad;
obj.Put("lastShift", lastShift); obj["lastShift"] = lastShift;
obj.Put("remoteIdentity", remoteIdent.Addr().ToString()); obj["remoteIdentity"] = remoteIdent.Addr().ToString();
obj.Put("currentRemoteIntroset", currentIntroSet.ExtractStatus()); obj["currentRemoteIntroset"] = currentIntroSet.ExtractStatus();
obj.Put("nextIntro", m_NextIntro.ExtractStatus()); obj["nextIntro"] = m_NextIntro.ExtractStatus();
std::vector< util::StatusObject > badIntrosObj;
std::transform(m_BadIntros.begin(), m_BadIntros.end(), std::transform(m_BadIntros.begin(), m_BadIntros.end(),
std::back_inserter(badIntrosObj), std::back_inserter(obj["badIntros"]),
[](const auto& item) -> util::StatusObject { [](const auto& item) -> util::StatusObject {
util::StatusObject o{ return util::StatusObject{
{"count", item.second}, {"count", item.second},
{"intro", item.first.ExtractStatus()}}; {"intro", item.first.ExtractStatus()}};
return o;
}); });
obj.Put("badIntros", badIntrosObj);
return obj; return obj;
} }

@ -1,64 +1 @@
#include <util/status.hpp> #include <util/status.hpp>
#include <util/traits.hpp>
namespace llarp
{
namespace util
{
struct StatusVisitor
{
std::string name;
std::reference_wrapper< nlohmann::json > data;
StatusVisitor(StatusObject::String_t n, nlohmann::json& d)
: name(n), data(d)
{
}
void
operator()(uint64_t val)
{
data.get()[name] = val;
}
void
operator()(const std::string& val)
{
data.get()[name] = val;
}
void
operator()(bool val)
{
data.get()[name] = val;
}
void
operator()(const StatusObject& obj)
{
data.get()[name] = obj.Impl;
}
void
operator()(const std::vector< std::string >& val)
{
data.get()[name] = val;
}
void
operator()(const std::vector< StatusObject >& val)
{
auto arr = nlohmann::json::array();
std::transform(val.begin(), val.end(), std::back_inserter(arr),
[](const auto& x) { return x.Impl; });
data.get()[name] = arr;
}
};
void
StatusObject::Put(const value_type& val)
{
Put(std::get< 0 >(val), std::get< 1 >(val));
}
void
StatusObject::Put(String_t name, const Variant& data)
{
absl::visit(StatusVisitor{name, Impl}, data);
}
} // namespace util
} // namespace llarp

@ -14,50 +14,7 @@ namespace llarp
{ {
namespace util namespace util
{ {
struct StatusVisitor; using StatusObject = nlohmann::json;
struct StatusObject
{
using String_t = string_view;
using Variant = absl::variant< uint64_t, std::string, bool, StatusObject,
std::vector< std::string >,
std::vector< StatusObject > >;
using value_type = std::pair< String_t, Variant >;
StatusObject(std::initializer_list< value_type > vals)
{
std::for_each(vals.begin(), vals.end(),
[&](const value_type& item) { Put(item); });
}
void
Put(String_t name, const Variant& value);
void
Put(const value_type& value);
template < typename Container, typename Getter >
void
PutContainer(String_t keyname, const Container& container, Getter get)
{
std::vector< util::StatusObject > objs;
std::transform(container.begin(), container.end(),
std::back_inserter(objs),
[get](const auto& item) -> util::StatusObject {
return get(item)->ExtractStatus();
});
Put(keyname, objs);
}
nlohmann::json
get() const
{
return Impl;
}
private:
friend struct StatusVisitor;
nlohmann::json Impl;
};
} // namespace util } // namespace util
} // namespace llarp } // namespace llarp

Loading…
Cancel
Save