diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index 13090b93b..a902801a7 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -52,9 +52,7 @@ namespace llarp // TODO: we don't support other protocols now; remove conf.defineOption("router", "default-protocol", false, m_DefaultLinkProto, - [this](std::string arg) { - m_DefaultLinkProto = arg; - }); + AssignmentAcceptor(m_DefaultLinkProto)); conf.defineOption("router", "netid", true, m_netId, [this](std::string arg) { @@ -91,14 +89,10 @@ namespace llarp // throw std::invalid_argument("[router]:min-connections must be less than [router]:max-connections"); conf.defineOption("router", "nickname", false, m_nickname, - [this](std::string arg) { - m_nickname = std::move(arg); - }); + AssignmentAcceptor(m_nickname)); conf.defineOption("router", "data-dir", false, GetDefaultDataDir(), - [this](std::string arg) { - m_dataDir = std::move(arg); - }); + AssignmentAcceptor(m_dataDir)); conf.defineOption("router", "public-address", false, "", [this](std::string arg) { @@ -141,9 +135,7 @@ namespace llarp }); conf.defineOption("router", "block-bogons", false, m_blockBogons, - [this](bool arg) { - m_blockBogons = arg; - }); + AssignmentAcceptor(m_blockBogons)); } void @@ -153,19 +145,13 @@ namespace llarp // TODO: review default value conf.defineOption("network", "profiling", false, m_enableProfiling, - [this](bool arg) { - m_enableProfiling = arg; - }); + AssignmentAcceptor(m_enableProfiling)); conf.defineOption("network", "profiles", false, m_routerProfilesFile, - [this](std::string arg) { - m_routerProfilesFile = std::move(arg); - }); + AssignmentAcceptor(m_routerProfilesFile)); conf.defineOption("network", "strict-connect", false, m_strictConnect, - [this](std::string arg) { - m_strictConnect = std::move(arg); - }); + AssignmentAcceptor(m_strictConnect)); // TODO: NetConfig was collecting all other k:v pairs here } @@ -176,9 +162,7 @@ namespace llarp (void)params; conf.defineOption("netdb", "dir", false, m_nodedbDir, - [this](std::string arg) { - m_nodedbDir = str(arg); - }); + AssignmentAcceptor(m_nodedbDir)); } void @@ -281,9 +265,7 @@ namespace llarp (void)params; conf.defineOption("system", "pidfile", false, pidfile, - [this](std::string arg) { - pidfile = std::move(arg); - }); + AssignmentAcceptor(pidfile)); } void @@ -292,14 +274,11 @@ namespace llarp (void)params; conf.defineOption("api", "enabled", false, m_enableRPCServer, - [this](bool arg) { - m_enableRPCServer = arg; - }); + AssignmentAcceptor(m_enableRPCServer)); conf.defineOption("api", "bind", false, m_rpcBindAddr, - [this](std::string arg) { - m_rpcBindAddr = std::move(arg); - }); + AssignmentAcceptor(m_rpcBindAddr)); + // TODO: this was from pre-refactor: // TODO: add pubkey to whitelist } @@ -319,25 +298,17 @@ namespace llarp }); conf.defineOption("lokid", "enabled", false, whitelistRouters, - [this](bool arg) { - whitelistRouters = arg; - }); + AssignmentAcceptor(whitelistRouters)); // TODO: was also aliased as "addr" -- presumably because loki-launcher conf.defineOption("lokid", "jsonrpc", false, lokidRPCAddr, - [this](std::string arg) { - lokidRPCAddr = arg; - }); + AssignmentAcceptor(lokidRPCAddr)); conf.defineOption("lokid", "username", false, lokidRPCUser, - [this](std::string arg) { - lokidRPCUser = arg; - }); + AssignmentAcceptor(lokidRPCUser)); conf.defineOption("lokid", "password", false, lokidRPCPassword, - [this](std::string arg) { - lokidRPCPassword = arg; - }); + AssignmentAcceptor(lokidRPCPassword)); } void @@ -382,9 +353,7 @@ namespace llarp }); conf.defineOption("logging", "file", false, "stdout", - [this](std::string arg) { - m_logFile = arg; - }); + AssignmentAcceptor(m_logFile)); } void @@ -403,9 +372,7 @@ namespace llarp }); conf.defineOption("snapp", "keyfile", false, ReachableDefault, - [this](bool arg) { - m_reachable = arg; - }); + AssignmentAcceptor(m_reachable)); conf.defineOption("snapp", "hops", false, HopsDefault, [this](int arg) { diff --git a/llarp/config/definition.hpp b/llarp/config/definition.hpp index f64beffaf..eab6bdb75 100644 --- a/llarp/config/definition.hpp +++ b/llarp/config/definition.hpp @@ -357,5 +357,17 @@ namespace llarp std::unordered_map m_definitionComments; }; + /// A convenience acceptor which takes a reference and later assigns it in its acceptor call. + /// + /// Note that this holds on to a reference; it must only be used when this is safe to do. In + /// particular, a reference to a local variable may be problematic. + template + std::function + AssignmentAcceptor(T& ref) { + return [&](T arg) mutable { + ref = std::move(arg); + }; + } + } // namespace llarp diff --git a/test/config/test_llarp_config_definition.cpp b/test/config/test_llarp_config_definition.cpp index 1b43302cd..e2d64002f 100644 --- a/test/config/test_llarp_config_definition.cpp +++ b/test/config/test_llarp_config_definition.cpp @@ -330,3 +330,15 @@ TEST_CASE("Configuration undeclared handler duplicate names", "[config]") REQUIRE(count == 3); } +TEST_CASE("Configuration AssignmentAcceptor", "[config]") +{ + llarp::Configuration config; + + int val = -1; + config.defineOption("foo", "bar", false, 2, llarp::AssignmentAcceptor(val)); + + config.addConfigValue("foo", "bar", "3"); + CHECK_NOTHROW(config.acceptAllOptions()); + + REQUIRE(val == 3); +}