mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-23 04:25:51 +00:00
New generic Ledger RPC handler.
This commit is contained in:
committed by
Vinnie Falco
parent
1cbcc7be21
commit
167f4666e2
@@ -24,11 +24,28 @@ namespace ripple {
|
||||
namespace RPC {
|
||||
namespace {
|
||||
|
||||
/** Adjust an old-style handler to be call-by-reference. */
|
||||
template <typename Function>
|
||||
Handler::Method<Json::Value> byRef (Function const& f)
|
||||
{
|
||||
return [f] (Context& context, Json::Value& result)
|
||||
{
|
||||
result = f (context);
|
||||
return Status();
|
||||
};
|
||||
}
|
||||
|
||||
class HandlerTable {
|
||||
public:
|
||||
HandlerTable(std::vector<Handler> const& entries) {
|
||||
HandlerTable (std::vector<Handler> const& entries) {
|
||||
for (auto& entry: entries)
|
||||
{
|
||||
assert (table_.find(entry.name_) == table_.end());
|
||||
table_[entry.name_] = entry;
|
||||
}
|
||||
|
||||
// This is where the new-style handlers are added.
|
||||
addHandler<LedgerHandler>();
|
||||
}
|
||||
|
||||
const Handler* getHandler(std::string name) {
|
||||
@@ -38,75 +55,109 @@ class HandlerTable {
|
||||
|
||||
private:
|
||||
std::map<std::string, Handler> table_;
|
||||
|
||||
template <class Impl>
|
||||
void addHandler()
|
||||
{
|
||||
assert (table_.find(Impl::name()) == table_.end());
|
||||
auto valueMethod = [] (Context& context, Json::Value& object)
|
||||
{
|
||||
Impl handler (context);
|
||||
auto status = handler.check (object);
|
||||
if (!status)
|
||||
handler.writeResult (object);
|
||||
return status;
|
||||
};
|
||||
|
||||
auto objectMethod = [] (Context& context, Object& object)
|
||||
{
|
||||
Impl handler (context);
|
||||
Json::Value error;
|
||||
auto status = handler.check (error);
|
||||
if (!status)
|
||||
handler.writeResult (object);
|
||||
else
|
||||
RPC::copyFrom (object, error);
|
||||
return status;
|
||||
};
|
||||
|
||||
auto handler = Handler {
|
||||
Impl::name(),
|
||||
valueMethod,
|
||||
Impl::role(),
|
||||
Impl::condition(),
|
||||
objectMethod};
|
||||
|
||||
table_[Impl::name()] = handler;
|
||||
};
|
||||
};
|
||||
|
||||
HandlerTable HANDLERS({
|
||||
// Request-response methods
|
||||
{ "account_info", &doAccountInfo, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_currencies", &doAccountCurrencies, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_lines", &doAccountLines, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_offers", &doAccountOffers, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_tx", &doAccountTxSwitch, Role::USER, NEEDS_NETWORK_CONNECTION },
|
||||
{ "blacklist", &doBlackList, Role::ADMIN, NO_CONDITION },
|
||||
{ "book_offers", &doBookOffers, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "can_delete", &doCanDelete, Role::ADMIN, NO_CONDITION },
|
||||
{ "connect", &doConnect, Role::ADMIN, NO_CONDITION },
|
||||
{ "consensus_info", &doConsensusInfo, Role::ADMIN, NO_CONDITION },
|
||||
{ "get_counts", &doGetCounts, Role::ADMIN, NO_CONDITION },
|
||||
{ "internal", &doInternal, Role::ADMIN, NO_CONDITION },
|
||||
{ "feature", &doFeature, Role::ADMIN, NO_CONDITION },
|
||||
{ "fetch_info", &doFetchInfo, Role::ADMIN, NO_CONDITION },
|
||||
{ "ledger", &doLedger, Role::USER, NEEDS_NETWORK_CONNECTION },
|
||||
{ "ledger_accept", &doLedgerAccept, Role::ADMIN, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_cleaner", &doLedgerCleaner, Role::ADMIN, NEEDS_NETWORK_CONNECTION },
|
||||
{ "ledger_closed", &doLedgerClosed, Role::USER, NEEDS_CLOSED_LEDGER },
|
||||
{ "ledger_current", &doLedgerCurrent, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_data", &doLedgerData, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_entry", &doLedgerEntry, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_header", &doLedgerHeader, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_request", &doLedgerRequest, Role::ADMIN, NO_CONDITION },
|
||||
{ "log_level", &doLogLevel, Role::ADMIN, NO_CONDITION },
|
||||
{ "logrotate", &doLogRotate, Role::ADMIN, NO_CONDITION },
|
||||
{ "owner_info", &doOwnerInfo, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "peers", &doPeers, Role::ADMIN, NO_CONDITION },
|
||||
{ "path_find", &doPathFind, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ping", &doPing, Role::USER, NO_CONDITION },
|
||||
{ "print", &doPrint, Role::ADMIN, NO_CONDITION },
|
||||
// { "profile", &doProfile, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "proof_create", &doProofCreate, Role::ADMIN, NO_CONDITION },
|
||||
{ "proof_solve", &doProofSolve, Role::ADMIN, NO_CONDITION },
|
||||
{ "proof_verify", &doProofVerify, Role::ADMIN, NO_CONDITION },
|
||||
{ "random", &doRandom, Role::USER, NO_CONDITION },
|
||||
{ "ripple_path_find", &doRipplePathFind, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "sign", &doSign, Role::USER, NO_CONDITION },
|
||||
{ "submit", &doSubmit, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "server_info", &doServerInfo, Role::USER, NO_CONDITION },
|
||||
{ "server_state", &doServerState, Role::USER, NO_CONDITION },
|
||||
{ "sms", &doSMS, Role::ADMIN, NO_CONDITION },
|
||||
{ "stop", &doStop, Role::ADMIN, NO_CONDITION },
|
||||
{ "transaction_entry", &doTransactionEntry, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "tx", &doTx, Role::USER, NEEDS_NETWORK_CONNECTION },
|
||||
{ "tx_history", &doTxHistory, Role::USER, NO_CONDITION },
|
||||
{ "unl_add", &doUnlAdd, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_delete", &doUnlDelete, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_list", &doUnlList, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_load", &doUnlLoad, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_network", &doUnlNetwork, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_reset", &doUnlReset, Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_score", &doUnlScore, Role::ADMIN, NO_CONDITION },
|
||||
{ "validation_create", &doValidationCreate, Role::ADMIN, NO_CONDITION },
|
||||
{ "validation_seed", &doValidationSeed, Role::ADMIN, NO_CONDITION },
|
||||
{ "wallet_accounts", &doWalletAccounts, Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "wallet_propose", &doWalletPropose, Role::ADMIN, NO_CONDITION },
|
||||
{ "wallet_seed", &doWalletSeed, Role::ADMIN, NO_CONDITION },
|
||||
{ "account_info", byRef (&doAccountInfo), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_currencies", byRef (&doAccountCurrencies), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_lines", byRef (&doAccountLines), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_offers", byRef (&doAccountOffers), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "account_tx", byRef (&doAccountTxSwitch), Role::USER, NEEDS_NETWORK_CONNECTION },
|
||||
{ "blacklist", byRef (&doBlackList), Role::ADMIN, NO_CONDITION },
|
||||
{ "book_offers", byRef (&doBookOffers), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "can_delete", byRef (&doCanDelete), Role::ADMIN, NO_CONDITION },
|
||||
{ "connect", byRef (&doConnect), Role::ADMIN, NO_CONDITION },
|
||||
{ "consensus_info", byRef (&doConsensusInfo), Role::ADMIN, NO_CONDITION },
|
||||
{ "get_counts", byRef (&doGetCounts), Role::ADMIN, NO_CONDITION },
|
||||
{ "internal", byRef (&doInternal), Role::ADMIN, NO_CONDITION },
|
||||
{ "feature", byRef (&doFeature), Role::ADMIN, NO_CONDITION },
|
||||
{ "fetch_info", byRef (&doFetchInfo), Role::ADMIN, NO_CONDITION },
|
||||
{ "ledger_accept", byRef (&doLedgerAccept), Role::ADMIN, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_cleaner", byRef (&doLedgerCleaner), Role::ADMIN, NEEDS_NETWORK_CONNECTION },
|
||||
{ "ledger_closed", byRef (&doLedgerClosed), Role::USER, NEEDS_CLOSED_LEDGER },
|
||||
{ "ledger_current", byRef (&doLedgerCurrent), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_data", byRef (&doLedgerData), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_entry", byRef (&doLedgerEntry), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_header", byRef (&doLedgerHeader), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ledger_request", byRef (&doLedgerRequest), Role::ADMIN, NO_CONDITION },
|
||||
{ "log_level", byRef (&doLogLevel), Role::ADMIN, NO_CONDITION },
|
||||
{ "logrotate", byRef (&doLogRotate), Role::ADMIN, NO_CONDITION },
|
||||
{ "owner_info", byRef (&doOwnerInfo), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "peers", byRef (&doPeers), Role::ADMIN, NO_CONDITION },
|
||||
{ "path_find", byRef (&doPathFind), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "ping", byRef (&doPing), Role::USER, NO_CONDITION },
|
||||
{ "print", byRef (&doPrint), Role::ADMIN, NO_CONDITION },
|
||||
// { "profile", byRef (&doProfile), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "proof_create", byRef (&doProofCreate), Role::ADMIN, NO_CONDITION },
|
||||
{ "proof_solve", byRef (&doProofSolve), Role::ADMIN, NO_CONDITION },
|
||||
{ "proof_verify", byRef (&doProofVerify), Role::ADMIN, NO_CONDITION },
|
||||
{ "random", byRef (&doRandom), Role::USER, NO_CONDITION },
|
||||
{ "ripple_path_find", byRef (&doRipplePathFind), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "sign", byRef (&doSign), Role::USER, NO_CONDITION },
|
||||
{ "submit", byRef (&doSubmit), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "server_info", byRef (&doServerInfo), Role::USER, NO_CONDITION },
|
||||
{ "server_state", byRef (&doServerState), Role::USER, NO_CONDITION },
|
||||
{ "sms", byRef (&doSMS), Role::ADMIN, NO_CONDITION },
|
||||
{ "stop", byRef (&doStop), Role::ADMIN, NO_CONDITION },
|
||||
{ "transaction_entry", byRef (&doTransactionEntry), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "tx", byRef (&doTx), Role::USER, NEEDS_NETWORK_CONNECTION },
|
||||
{ "tx_history", byRef (&doTxHistory), Role::USER, NO_CONDITION },
|
||||
{ "unl_add", byRef (&doUnlAdd), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_delete", byRef (&doUnlDelete), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_list", byRef (&doUnlList), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_load", byRef (&doUnlLoad), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_network", byRef (&doUnlNetwork), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_reset", byRef (&doUnlReset), Role::ADMIN, NO_CONDITION },
|
||||
{ "unl_score", byRef (&doUnlScore), Role::ADMIN, NO_CONDITION },
|
||||
{ "validation_create", byRef (&doValidationCreate), Role::ADMIN, NO_CONDITION },
|
||||
{ "validation_seed", byRef (&doValidationSeed), Role::ADMIN, NO_CONDITION },
|
||||
{ "wallet_accounts", byRef (&doWalletAccounts), Role::USER, NEEDS_CURRENT_LEDGER },
|
||||
{ "wallet_propose", byRef (&doWalletPropose), Role::ADMIN, NO_CONDITION },
|
||||
{ "wallet_seed", byRef (&doWalletSeed), Role::ADMIN, NO_CONDITION },
|
||||
// Evented methods
|
||||
{ "subscribe", &doSubscribe, Role::USER, NO_CONDITION },
|
||||
{ "unsubscribe", &doUnsubscribe, Role::USER, NO_CONDITION },
|
||||
{ "subscribe", byRef (&doSubscribe), Role::USER, NO_CONDITION },
|
||||
{ "unsubscribe", byRef (&doUnsubscribe), Role::USER, NO_CONDITION },
|
||||
});
|
||||
|
||||
} // namespace
|
||||
|
||||
const Handler* getHandler(std::string name) {
|
||||
const Handler* getHandler(std::string const& name) {
|
||||
return HANDLERS.getHandler(name);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user