23#include <unordered_map>
35bool isEquals(
const std::string& s1,
const std::string& s2);
38bool parse(uint64_t& result,
const std::string& value);
41bool parse(int64_t& result,
const std::string& value);
44bool parse(
double& result,
const std::string& value);
47bool parse(
bool& result,
const std::string& value);
51#define ONIXS_TYPENAME(Type) template<> inline const char * NumberName<Type>::name() noexcept { return #Type; }
64T
parse(
const std::string& value)
66 static_assert(std::is_arithmetic<T>::value,
"");
68 using Wide =
typename std::conditional<std::is_floating_point<T>::value, double,
typename std::conditional<std::is_signed<T>::value, int64_t, uint64_t>::type>::type;
72 if(!
parse(v, value) ||
static_cast<Wide
>(
static_cast<T
>(v)) != v)
73 throw std::invalid_argument(
"Cannot parse " + std::string(
NumberName<T>::name()) +
" value: '" + value +
"'");
75 return static_cast<T
>(v);
94 throw std::invalid_argument(
"Cannot parse bool value: '" + value +
"'");
110template<
typename C>
using Setter = std::function<void(
C&,
const std::string&)>;
111template<
typename C>
using Registry = std::unordered_map<std::string, Setter<C>>;
113template<
typename C,
typename Arg>
116 using Type =
typename std::decay<Arg>::type ;
117 return [mf](
C& obj,
const std::string& text)
125void loadFromFile(
const std::string& fileName,
C& obj,
const Registry<C>& reg,
const std::string& rootNode,
bool ignoreUnknown =
true)
129 for (
const auto& pair : map)
131 const auto& key = pair.first;
132 const auto& value = pair.second;
134 const auto it = reg.find(key);
140 it->second(obj, value);
147 else if (!ignoreUnknown)
148 throw std::invalid_argument(
"Unknown configuration property '" + key +
"'");
#define ONIXS_ICEBOE_NAMESPACE_BEGIN
#define ONIXS_ICEBOE_NAMESPACE_END
#define ONIXS_ICEBOE_EXPORTED
#define ONIXS_TYPENAME(Type)
@ C
Vendor-provided platform billed by executing broker.
T fromString(const std::string &value)
bool parse(uint64_t &result, const std::string &value)
bool isEquals(const std::string &s1, const std::string &s2)
KeyValueMap parseConfigFile(const std::string &fileName, const std::string &rootNode)
Parses the given file to the key-value pair map.
std::unordered_map< std::string, Setter< C > > Registry
void throwCannotApplyConfigurationValue(const std::string &key, const std::string &value)
void loadFromFile(const std::string &fileName, C &obj, const Registry< C > ®, const std::string &rootNode, bool ignoreUnknown=true)
Loads configuration from the given file.
Setter< C > makeSetter(C &(C::*mf)(Arg))
std::function< void(C &, const std::string &)> Setter
std::unordered_map< std::string, std::string > KeyValueMap
static const char * name() noexcept