5151#include < string>
5252#include < system_error>
5353#include < thread>
54+ #include < tuple>
5455#include < typeinfo>
56+ #include < variant>
5557
5658// Application startup time (used for uptime calculation)
5759const int64_t nStartupTime = GetTime();
@@ -931,15 +933,19 @@ bool ArgsManager::ReadConfigFiles(std::string& error, bool ignore_invalid_keys)
931933
932934ChainType ArgsManager::GetChainType () const
933935{
934- std::string chain_str = GetChainTypeString ();
935- std::optional<ChainType> chain = ChainTypeFromString (chain_str);
936- if (!chain) {
937- throw std::runtime_error (strprintf (" Unknown chain %s." , chain_str));
938- }
939- return *chain;
936+ std::variant<ChainType, std::string> arg = GetChainArg ();
937+ if (auto * parsed = std::get_if<ChainType>(&arg)) return *parsed;
938+ throw std::runtime_error (strprintf (" Unknown chain %s." , std::get<std::string>(arg)));
940939}
941940
942941std::string ArgsManager::GetChainTypeString () const
942+ {
943+ auto arg = GetChainArg ();
944+ if (auto * parsed = std::get_if<ChainType>(&arg)) return ChainTypeToString (*parsed);
945+ return std::get<std::string>(arg);
946+ }
947+
948+ std::variant<ChainType, std::string> ArgsManager::GetChainArg () const
943949{
944950 auto get_net = [&](const std::string& arg) {
945951 LOCK (cs_args);
@@ -953,19 +959,20 @@ std::string ArgsManager::GetChainTypeString() const
953959 const bool fRegTest = get_net (" -regtest" );
954960 const bool fSigNet = get_net (" -signet" );
955961 const bool fTestNet = get_net (" -testnet" );
956- const bool is_chain_arg_set = IsArgSet (" -chain" );
962+ const auto chain_arg = GetArg (" -chain" );
957963
958- if ((int )is_chain_arg_set + (int )fRegTest + (int )fSigNet + (int )fTestNet > 1 ) {
964+ if ((int )chain_arg. has_value () + (int )fRegTest + (int )fSigNet + (int )fTestNet > 1 ) {
959965 throw std::runtime_error (" Invalid combination of -regtest, -signet, -testnet and -chain. Can use at most one." );
960966 }
961- if (fRegTest )
962- return ChainTypeToString (ChainType::REGTEST);
963- if (fSigNet )
964- return ChainTypeToString (ChainType::SIGNET);
965- if (fTestNet )
966- return ChainTypeToString (ChainType::TESTNET);
967-
968- return GetArg (" -chain" , ChainTypeToString (ChainType::MAIN));
967+ if (chain_arg) {
968+ if (auto parsed = ChainTypeFromString (*chain_arg)) return *parsed;
969+ // Not a known string, so return original string
970+ return *chain_arg;
971+ }
972+ if (fRegTest ) return ChainType::REGTEST;
973+ if (fSigNet ) return ChainType::SIGNET;
974+ if (fTestNet ) return ChainType::TESTNET;
975+ return ChainType::MAIN;
969976}
970977
971978bool ArgsManager::UseDefaultSection (const std::string& arg) const
0 commit comments