rpc: Add RPCHelpMan::IsValidNumArgs()

This commit is contained in:
MarcoFalke 2019-02-12 20:16:29 -05:00
parent f9775a8655
commit fa05626ca7
No known key found for this signature in database
GPG key ID: CE2B75697E69A548
2 changed files with 28 additions and 9 deletions

View file

@ -1,4 +1,4 @@
// Copyright (c) 2017-2018 The Bitcoin Core developers // Copyright (c) 2017-2019 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -315,6 +315,17 @@ 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;
} }
bool RPCHelpMan::IsValidNumArgs(size_t num_args) const
{
size_t num_required_args = 0;
for (size_t n = m_args.size(); n > 0; --n) {
if (!m_args.at(n - 1).IsOptional()) {
num_required_args = n;
break;
}
}
return num_required_args <= num_args && num_args <= m_args.size();
}
std::string RPCHelpMan::ToString() const std::string RPCHelpMan::ToString() const
{ {
std::string ret; std::string ret;
@ -323,12 +334,7 @@ std::string RPCHelpMan::ToString() const
ret += m_name; ret += m_name;
bool was_optional{false}; bool was_optional{false};
for (const auto& arg : m_args) { for (const auto& arg : m_args) {
bool optional; const bool optional = arg.IsOptional();
if (arg.m_fallback.which() == 1) {
optional = true;
} else {
optional = RPCArg::Optional::NO != boost::get<RPCArg::Optional>(arg.m_fallback);
}
ret += " "; ret += " ";
if (optional) { if (optional) {
if (!was_optional) ret += "( "; if (!was_optional) ret += "( ";
@ -370,6 +376,15 @@ std::string RPCHelpMan::ToString() const
return ret; return ret;
} }
bool RPCArg::IsOptional() const
{
if (m_fallback.which() == 1) {
return true;
} else {
return RPCArg::Optional::NO != boost::get<RPCArg::Optional>(m_fallback);
}
}
std::string RPCArg::ToDescriptionString() const std::string RPCArg::ToDescriptionString() const
{ {
std::string ret; std::string ret;

View file

@ -1,4 +1,4 @@
// Copyright (c) 2017-2018 The Bitcoin Core developers // Copyright (c) 2017-2019 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -53,7 +53,7 @@ struct RPCArg {
/** Required arg */ /** Required arg */
NO, NO,
/** /**
* Optinal arg that is a named argument and has a default value of * Optional arg that is a named argument and has a default value of
* `null`. When possible, the default value should be specified. * `null`. When possible, the default value should be specified.
*/ */
OMITTED_NAMED_ARG, OMITTED_NAMED_ARG,
@ -110,6 +110,8 @@ struct RPCArg {
assert(type == Type::ARR || type == Type::OBJ); assert(type == Type::ARR || type == Type::OBJ);
} }
bool IsOptional() const;
/** /**
* Return the type string of the argument. * Return the type string of the argument.
* Set oneline to allow it to be overridden by a custom oneline type string (m_oneline_description). * Set oneline to allow it to be overridden by a custom oneline type string (m_oneline_description).
@ -185,6 +187,8 @@ public:
RPCHelpMan(std::string name, std::string description, std::vector<RPCArg> args, RPCResults results, RPCExamples examples); RPCHelpMan(std::string name, std::string description, std::vector<RPCArg> args, RPCResults results, RPCExamples examples);
std::string ToString() const; std::string ToString() const;
/** If the supplied number of args is neither too small nor too high */
bool IsValidNumArgs(size_t num_args) const;
private: private:
const std::string m_name; const std::string m_name;