mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Merge #20459: rpc: Fail to return undocumented return values
fa8192f42e1d24444f1d0433c96dbce1adf76967 rpc: Fail to return undocumented return values (MarcoFalke) Pull request description: Currently a few return values are undocumented. This is causing confusion at the least. See for example #18476 Fix this by treating it as an internal bug to return undocumented return values. ACKs for top commit: ryanofsky: Code review ACK fa8192f42e1d24444f1d0433c96dbce1adf76967. Only changes: rebase, no const_cast suggestion, and tostring cleanups needed after suggestion Tree-SHA512: c006905639bafe3045de152b00c34d9864731becb3c4f468bdd61a392f10d7e7cd89a54862c8daa8c11ac4eea0eb5f13b0f647d21e21a0a797b54191cff7238c
This commit is contained in:
parent
444956733a
commit
2be1604405
@ -26,7 +26,7 @@ static RPCHelpMan rpcNestedTest_rpc()
|
|||||||
{"arg2", RPCArg::Type::STR, RPCArg::Optional::OMITTED, ""},
|
{"arg2", RPCArg::Type::STR, RPCArg::Optional::OMITTED, ""},
|
||||||
{"arg3", RPCArg::Type::STR, RPCArg::Optional::OMITTED, ""},
|
{"arg3", RPCArg::Type::STR, RPCArg::Optional::OMITTED, ""},
|
||||||
},
|
},
|
||||||
{},
|
RPCResult{RPCResult::Type::ANY, "", ""},
|
||||||
RPCExamples{""},
|
RPCExamples{""},
|
||||||
[](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue {
|
[](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue {
|
||||||
return request.params.write(0, 0);
|
return request.params.write(0, 0);
|
||||||
|
@ -1392,7 +1392,7 @@ static RPCHelpMan echo(const std::string& name)
|
|||||||
{"arg8", RPCArg::Type::STR, RPCArg::Optional::OMITTED_NAMED_ARG, ""},
|
{"arg8", RPCArg::Type::STR, RPCArg::Optional::OMITTED_NAMED_ARG, ""},
|
||||||
{"arg9", RPCArg::Type::STR, RPCArg::Optional::OMITTED_NAMED_ARG, ""},
|
{"arg9", RPCArg::Type::STR, RPCArg::Optional::OMITTED_NAMED_ARG, ""},
|
||||||
},
|
},
|
||||||
RPCResult{RPCResult::Type::NONE, "", "Returns whatever was passed in"},
|
RPCResult{RPCResult::Type::ANY, "", "Returns whatever was passed in"},
|
||||||
RPCExamples{""},
|
RPCExamples{""},
|
||||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||||
{
|
{
|
||||||
|
@ -171,8 +171,9 @@ static RPCHelpMan help()
|
|||||||
{"command", RPCArg::Type::STR, /* default */ "all commands", "The command to get help on"},
|
{"command", RPCArg::Type::STR, /* default */ "all commands", "The command to get help on"},
|
||||||
{"subcommand", RPCArg::Type::STR, /* default */ "all subcommands", "The subcommand to get help on."},
|
{"subcommand", RPCArg::Type::STR, /* default */ "all subcommands", "The subcommand to get help on."},
|
||||||
},
|
},
|
||||||
RPCResult{
|
{
|
||||||
RPCResult::Type::STR, "", "The help text"
|
RPCResult{RPCResult::Type::STR, "", "The help text"},
|
||||||
|
RPCResult{RPCResult::Type::ANY, "", ""},
|
||||||
},
|
},
|
||||||
RPCExamples{""},
|
RPCExamples{""},
|
||||||
[&](const RPCHelpMan& self, const JSONRPCRequest& jsonRequest) -> UniValue
|
[&](const RPCHelpMan& self, const JSONRPCRequest& jsonRequest) -> UniValue
|
||||||
|
@ -476,6 +476,7 @@ std::string RPCResults::ToDescriptionString() const
|
|||||||
{
|
{
|
||||||
std::string result;
|
std::string result;
|
||||||
for (const auto& r : m_results) {
|
for (const auto& r : m_results) {
|
||||||
|
if (r.m_type == RPCResult::Type::ANY) continue; // for testing only
|
||||||
if (r.m_cond.empty()) {
|
if (r.m_cond.empty()) {
|
||||||
result += "\nResult:\n";
|
result += "\nResult:\n";
|
||||||
} else {
|
} else {
|
||||||
@ -493,7 +494,7 @@ std::string RPCExamples::ToDescriptionString() const
|
|||||||
return m_examples.empty() ? m_examples : "\nExamples:\n" + m_examples;
|
return m_examples.empty() ? m_examples : "\nExamples:\n" + m_examples;
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue RPCHelpMan::HandleRequest(const JSONRPCRequest& request)
|
UniValue RPCHelpMan::HandleRequest(const JSONRPCRequest& request) const
|
||||||
{
|
{
|
||||||
if (request.mode == JSONRPCRequest::GET_ARGS) {
|
if (request.mode == JSONRPCRequest::GET_ARGS) {
|
||||||
return GetArgMap();
|
return GetArgMap();
|
||||||
@ -710,6 +711,9 @@ void RPCResult::ToSections(Sections& sections, const OuterType outer_type, const
|
|||||||
sections.PushSection({indent + "..." + maybe_separator, m_description});
|
sections.PushSection({indent + "..." + maybe_separator, m_description});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case Type::ANY: {
|
||||||
|
CHECK_NONFATAL(false); // Only for testing
|
||||||
|
}
|
||||||
case Type::NONE: {
|
case Type::NONE: {
|
||||||
sections.PushSection({indent + "null" + maybe_separator, Description("json null")});
|
sections.PushSection({indent + "null" + maybe_separator, Description("json null")});
|
||||||
return;
|
return;
|
||||||
@ -775,6 +779,42 @@ void RPCResult::ToSections(Sections& sections, const OuterType outer_type, const
|
|||||||
CHECK_NONFATAL(false);
|
CHECK_NONFATAL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RPCResult::MatchesType(const UniValue& result) const
|
||||||
|
{
|
||||||
|
switch (m_type) {
|
||||||
|
case Type::ELISION: {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case Type::ANY: {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case Type::NONE: {
|
||||||
|
return UniValue::VNULL == result.getType();
|
||||||
|
}
|
||||||
|
case Type::STR:
|
||||||
|
case Type::STR_HEX: {
|
||||||
|
return UniValue::VSTR == result.getType();
|
||||||
|
}
|
||||||
|
case Type::NUM:
|
||||||
|
case Type::STR_AMOUNT:
|
||||||
|
case Type::NUM_TIME: {
|
||||||
|
return UniValue::VNUM == result.getType();
|
||||||
|
}
|
||||||
|
case Type::BOOL: {
|
||||||
|
return UniValue::VBOOL == result.getType();
|
||||||
|
}
|
||||||
|
case Type::ARR_FIXED:
|
||||||
|
case Type::ARR: {
|
||||||
|
return UniValue::VARR == result.getType();
|
||||||
|
}
|
||||||
|
case Type::OBJ_DYN:
|
||||||
|
case Type::OBJ: {
|
||||||
|
return UniValue::VOBJ == result.getType();
|
||||||
|
}
|
||||||
|
} // no default case, so the compiler can warn about missing cases
|
||||||
|
CHECK_NONFATAL(false);
|
||||||
|
}
|
||||||
|
|
||||||
std::string RPCArg::ToStringObj(const bool oneline) const
|
std::string RPCArg::ToStringObj(const bool oneline) const
|
||||||
{
|
{
|
||||||
std::string res;
|
std::string res;
|
||||||
|
@ -230,6 +230,7 @@ struct RPCResult {
|
|||||||
NUM,
|
NUM,
|
||||||
BOOL,
|
BOOL,
|
||||||
NONE,
|
NONE,
|
||||||
|
ANY, //!< Special type to disable type checks (for testing only)
|
||||||
STR_AMOUNT, //!< Special string to represent a floating point amount
|
STR_AMOUNT, //!< Special string to represent a floating point amount
|
||||||
STR_HEX, //!< Special string with only hex chars
|
STR_HEX, //!< Special string with only hex chars
|
||||||
OBJ_DYN, //!< Special dictionary with keys that are not literals
|
OBJ_DYN, //!< Special dictionary with keys that are not literals
|
||||||
@ -302,6 +303,8 @@ struct RPCResult {
|
|||||||
std::string ToStringObj() const;
|
std::string ToStringObj() const;
|
||||||
/** Return the description string, including the result type. */
|
/** Return the description string, including the result type. */
|
||||||
std::string ToDescriptionString() const;
|
std::string ToDescriptionString() const;
|
||||||
|
/** Check whether the result JSON type matches. */
|
||||||
|
bool MatchesType(const UniValue& result) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RPCResults {
|
struct RPCResults {
|
||||||
@ -340,7 +343,7 @@ public:
|
|||||||
using RPCMethodImpl = std::function<UniValue(const RPCHelpMan&, const JSONRPCRequest&)>;
|
using RPCMethodImpl = std::function<UniValue(const RPCHelpMan&, const JSONRPCRequest&)>;
|
||||||
RPCHelpMan(std::string name, std::string description, std::vector<RPCArg> args, RPCResults results, RPCExamples examples, RPCMethodImpl fun);
|
RPCHelpMan(std::string name, std::string description, std::vector<RPCArg> args, RPCResults results, RPCExamples examples, RPCMethodImpl fun);
|
||||||
|
|
||||||
UniValue HandleRequest(const JSONRPCRequest& request);
|
UniValue HandleRequest(const JSONRPCRequest& request) const;
|
||||||
std::string ToString() const;
|
std::string ToString() const;
|
||||||
/** Return the named args that need to be converted from string to another JSON type */
|
/** Return the named args that need to be converted from string to another JSON type */
|
||||||
UniValue GetArgMap() const;
|
UniValue GetArgMap() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user