#ifndef CONFIG_H #define CONFIG_H #include <string> #include <boost/program_options/options_description.hpp> #include <boost/program_options/variables_map.hpp> /** * Functions to parse and store i2pd parameters * * General usage flow: * Init() -- early as possible * ParseCmdline() -- somewhere close to main() * ParseConfig() -- after detecting path to config * Finalize() -- right after all Parse*() functions called * GetOption() -- may be called after Finalize() */ namespace i2p { namespace config { extern boost::program_options::variables_map m_Options; /** * @brief Initialize list of acceptable parameters * * Should be called before any Parse* functions. */ void Init(); /** * @brief Parse cmdline parameters, and show help if requested * @param argc Cmdline arguments count, should be passed from main(). * @param argv Cmdline parameters array, should be passed from main() * * If --help is given in parameters, shows it's list with description * terminates the program with exitcode 0. * * In case of parameter misuse boost throws an exception. * We internally handle type boost::program_options::unknown_option, * and then terminate program with exitcode 1. * * Other exceptions will be passed to higher level. */ void ParseCmdline(int argc, char* argv[]); /** * @brief Load and parse given config file * @param path Path to config file * * If error occured when opening file path is points to, * we show the error message and terminate program. * * In case of parameter misuse boost throws an exception. * We internally handle type boost::program_options::unknown_option, * and then terminate program with exitcode 1. * * Other exceptions will be passed to higher level. */ void ParseConfig(const std::string& path); /** * @brief Used to combine options from cmdline, config and default values */ void Finalize(); /* @brief Accessor to parameters by name * @param name Name of the requested parameter * @param value Variable where to store option * @return this function returns false if parameter not found * * Example: uint16_t port; GetOption("sam.port", port); */ template<typename T> bool GetOption(const char *name, T& value) { if (!m_Options.count(name)) return false; value = m_Options[name].as<T>(); return true; } template<typename T> bool GetOption(const std::string& name, T& value) { return GetOption (name.c_str (), value); } /** * @brief Set value of given parameter * @param name Name of settable parameter * @param value New parameter value * @return true if value set up successful, false otherwise * * Example: uint16_t port = 2827; SetOption("bob.port", port); */ template<typename T> bool SetOption(const char *name, const T& value) { if (!m_Options.count(name)) return false; m_Options.at(name).value() = value; notify(m_Options); return true; } /** * @brief Check is value explicitly given or default * @param name Name of checked parameter * @return true if value set to default, false othervise */ bool IsDefault(const char *name); } } #endif // CONFIG_H