diff --git a/src/rpc/server.h b/src/rpc/server.h --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -145,6 +146,7 @@ const JSONRPCRequest &jsonRequest); using const_rpcfn_type = UniValue (*)(const Config &config, const JSONRPCRequest &jsonRequest); +using RpcMethodFnType = RPCHelpMan (*)(); class CRPCCommand { public: @@ -162,6 +164,18 @@ actor(std::move(_actor)), argNames(std::move(_args)), unique_id(_unique_id) {} + //! Simplified constructor taking plain RpcMethodFnType function pointer. + CRPCCommand(std::string _category, std::string name_in, RpcMethodFnType _fn, + std::vector args_in) + : CRPCCommand( + _category, _fn().m_name, + [_fn](Config &config, const JSONRPCRequest &request, + UniValue &result, bool) { + result = _fn().HandleRequest(config, request); + return true; + }, + _fn().GetArgNames(), intptr_t(_fn)) {} + //! Simplified constructor taking plain rpcfn_type function pointer. CRPCCommand(const char *_category, const char *_name, rpcfn_type _fn, std::initializer_list _args) @@ -194,7 +208,7 @@ }; /** - * Bitcoin RPC command dispatcher. + * RPC command dispatcher. */ class CRPCTable { private: diff --git a/src/rpc/util.h b/src/rpc/util.h --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -334,8 +334,16 @@ RPCHelpMan(std::string name, std::string description, std::vector args, RPCResults results, RPCExamples examples); + using RPCMethodImpl = std::function; + RPCHelpMan(std::string name, std::string description, + std::vector args, RPCResults results, + RPCExamples examples, RPCMethodImpl fun); std::string ToString() const; + UniValue HandleRequest(Config &config, const JSONRPCRequest &request) { + return m_fun(*this, config, request); + } /** If the supplied number of args is neither too small nor too high */ bool IsValidNumArgs(size_t num_args) const; /** @@ -348,8 +356,12 @@ } } -private: + std::vector GetArgNames() const; + const std::string m_name; + +private: + const RPCMethodImpl m_fun; const std::string m_description; const std::vector m_args; const RPCResults m_results; diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -459,9 +459,15 @@ RPCHelpMan::RPCHelpMan(std::string name_, std::string description, std::vector args, RPCResults results, RPCExamples examples) - : m_name{std::move(name_)}, m_description{std::move(description)}, - m_args{std::move(args)}, m_results{std::move(results)}, - m_examples{std::move(examples)} { + : RPCHelpMan{std::move(name_), std::move(description), std::move(args), + std::move(results), std::move(examples), nullptr} {} + +RPCHelpMan::RPCHelpMan(std::string name_, std::string description, + std::vector args, RPCResults results, + RPCExamples examples, RPCMethodImpl fun) + : m_name{std::move(name_)}, m_fun{std::move(fun)}, + m_description{std::move(description)}, m_args{std::move(args)}, + m_results{std::move(results)}, m_examples{std::move(examples)} { std::set named_args; for (const auto &arg : m_args) { std::vector names; @@ -502,6 +508,15 @@ } return num_required_args <= num_args && num_args <= m_args.size(); } + +std::vector RPCHelpMan::GetArgNames() const { + std::vector ret; + for (const auto &arg : m_args) { + ret.emplace_back(arg.m_names); + } + return ret; +} + std::string RPCHelpMan::ToString() const { std::string ret;