From b7f06ac35251037dc2844d1997a5b971432b13c4 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 3 Oct 2012 16:40:11 +0200 Subject: [PATCH] CONFIG_*_DEFAULTED now uses safeAs and should be used everywhere instead of CONFIG_* macros --- include/transport/config.h | 20 +++++++++++++++++--- src/tests/config.cpp | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/include/transport/config.h b/include/transport/config.h index a672abe6..3c29dd64 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -28,6 +28,20 @@ #include #include +namespace Transport { + +template +const myType &safeAs(const boost::program_options::variable_value &var, const myType &def) { + try { + return var.as(); + } + catch(...) { + return def; + } +} + +} + #define CONFIG_HAS_KEY(PTR, KEY) (*PTR).hasKey(KEY) #define CONFIG_STRING(PTR, KEY) (*PTR)[KEY].as() #define CONFIG_INT(PTR, KEY) (*PTR)[KEY].as() @@ -35,9 +49,9 @@ #define CONFIG_LIST(PTR, KEY) (*PTR)[KEY].as >() #define CONFIG_VECTOR(PTR, KEY) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as >() : std::vector()) -#define CONFIG_STRING_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as() : DEF) -#define CONFIG_BOOL_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as() : DEF) -#define CONFIG_LIST_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as >() : DEF) +#define CONFIG_STRING_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? Transport::safeAs((*PTR)[KEY], DEF) : DEF) +#define CONFIG_BOOL_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? Transport::safeAs((*PTR)[KEY], DEF) : DEF) +#define CONFIG_LIST_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? Transport::safeAs >((*PTR)[KEY], DEF) : DEF) namespace Transport { diff --git a/src/tests/config.cpp b/src/tests/config.cpp index 2f524677..24776a74 100644 --- a/src/tests/config.cpp +++ b/src/tests/config.cpp @@ -28,6 +28,8 @@ class ConfigTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_TEST(updateBackendConfig); CPPUNIT_TEST(unregisteredList); CPPUNIT_TEST(unregisteredString); + CPPUNIT_TEST(unregisteredListAsString); + CPPUNIT_TEST(unregisteredStringAsList); CPPUNIT_TEST_SUITE_END(); public: @@ -69,6 +71,21 @@ class ConfigTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_ASSERT_EQUAL(std::string("irc.freenode.org"), CONFIG_STRING(&cfg, "service.irc_server")); } + void unregisteredListAsString() { + Config cfg; + std::istringstream ifs("service.irc_server = irc.freenode.orgn\nservice.irc_server = irc2.freenode.org"); + cfg.load(ifs); + CPPUNIT_ASSERT_EQUAL(std::string(""), CONFIG_STRING_DEFAULTED(&cfg, "service.irc_server", "")); + } + + void unregisteredStringAsList() { + Config cfg; + std::istringstream ifs("service.irc_server = irc.freenode.org"); + cfg.load(ifs); + std::list list; + CPPUNIT_ASSERT_EQUAL(0, (int) CONFIG_LIST_DEFAULTED(&cfg, "service.irc_server", list).size()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION (ConfigTest);