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{};
for(const auto& item : nodes)
{
obj.Put(item.first.ToHex(), item.second.ExtractStatus());
obj[item.first.ToHex()] = item.second.ExtractStatus();
}
return obj;
}

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

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

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

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

@ -51,9 +51,9 @@ namespace llarp
util::StatusObject exitsObj{};
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;
}

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

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

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

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

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

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

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

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

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

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

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

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

@ -116,31 +116,40 @@ namespace llarp
util::StatusObject
EndpointState::ExtractStatus(util::StatusObject& obj) const
{
obj.Put("lastPublished", m_LastPublish);
obj.Put("lastPublishAttempt", m_LastPublishAttempt);
obj.Put("introset", m_IntroSet.ExtractStatus());
obj["lastPublished"] = m_LastPublish;
obj["lastPublishAttempt"] = m_LastPublishAttempt;
obj["introset"] = m_IntroSet.ExtractStatus();
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);
obj.PutContainer("lookups", m_PendingLookups, getSecond);
obj.PutContainer("snodeSessions", m_SNodeSessions,
[](const auto& item) { return item.second.first; });
std::transform(m_DeadSessions.begin(), m_DeadSessions.end(),
std::back_inserter(obj["deadSessions"]), getSecond);
std::transform(m_RemoteSessions.begin(), m_RemoteSessions.end(),
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{};
for(const auto& item : m_Sessions)
{
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;
}
} // namespace service

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

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

@ -1,64 +1 @@
#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
{
struct StatusVisitor;
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;
};
using StatusObject = nlohmann::json;
} // namespace util
} // namespace llarp

Loading…
Cancel
Save