diff options
Diffstat (limited to 'src/rpc/util.cpp')
-rw-r--r-- | src/rpc/util.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index ba3105ca01..df3ee9f007 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -498,6 +498,33 @@ RPCHelpMan::RPCHelpMan(std::string name, std::string description, std::vector<RP for (const std::string& name : names) { CHECK_NONFATAL(named_args.insert(name).second); } + // Default value type should match argument type only when defined + if (arg.m_fallback.index() == 2) { + const RPCArg::Type type = arg.m_type; + switch (std::get<RPCArg::Default>(arg.m_fallback).getType()) { + case UniValue::VOBJ: + CHECK_NONFATAL(type == RPCArg::Type::OBJ); + break; + case UniValue::VARR: + CHECK_NONFATAL(type == RPCArg::Type::ARR); + break; + case UniValue::VSTR: + CHECK_NONFATAL(type == RPCArg::Type::STR || type == RPCArg::Type::STR_HEX || type == RPCArg::Type::AMOUNT); + break; + case UniValue::VNUM: + CHECK_NONFATAL(type == RPCArg::Type::NUM || type == RPCArg::Type::AMOUNT || type == RPCArg::Type::RANGE); + break; + case UniValue::VBOOL: + CHECK_NONFATAL(type == RPCArg::Type::BOOL); + break; + case UniValue::VNULL: + // Null values are accepted in all arguments + break; + default: + CHECK_NONFATAL(false); + break; + } + } } } @@ -646,7 +673,7 @@ std::string RPCArg::GetName() const bool RPCArg::IsOptional() const { - if (m_fallback.index() == 1) { + if (m_fallback.index() != 0) { return true; } else { return RPCArg::Optional::NO != std::get<RPCArg::Optional>(m_fallback); @@ -694,7 +721,9 @@ std::string RPCArg::ToDescriptionString() const } // no default case, so the compiler can warn about missing cases } if (m_fallback.index() == 1) { - ret += ", optional, default=" + std::get<std::string>(m_fallback); + ret += ", optional, default=" + std::get<RPCArg::DefaultHint>(m_fallback); + } else if (m_fallback.index() == 2) { + ret += ", optional, default=" + std::get<RPCArg::Default>(m_fallback).write(); } else { switch (std::get<RPCArg::Optional>(m_fallback)) { case RPCArg::Optional::OMITTED: { |