/** Configuration file parsing. * * @file * @author Steffen Vogel * @copyright 2014-2022, Institute for Automation of Complex Power Systems, EONERC * @license Apache 2.0 *********************************************************************************/ #pragma once #include #include #include #include #include #include #include #ifdef WITH_CONFIG #include #endif namespace villas { namespace node { class Config { protected: using str_walk_fcn_t = std::function; Logger logger; std::list includeDirectories; /** Check if file exists on local system. */ static bool isLocalFile(const std::string &uri) { return access(uri.c_str(), F_OK) != -1; } /** Decode configuration file. */ json_t * decode(FILE *f); #ifdef WITH_CONFIG /** Convert libconfig .conf file to libjansson .json file. */ json_t * libconfigDecode(FILE *f); static const char ** includeFuncStub(config_t *cfg, const char *include_dir, const char *path, const char **error); const char ** includeFunc(config_t *cfg, const char *include_dir, const char *path, const char **error); #endif /* WITH_CONFIG */ /** Load configuration from standard input (stdim). */ FILE * loadFromStdio(); /** Load configuration from local file. */ FILE * loadFromLocalFile(const std::string &u); std::list resolveIncludes(const std::string &name); void resolveEnvVars(std::string &text); /** Resolve custom include directives. */ json_t * expandIncludes(json_t *in); /** To shell-like subsitution of environment variables in strings. */ json_t * expandEnvVars(json_t *in); /** Run a callback function for each string in the config */ json_t * walkStrings(json_t *in, str_walk_fcn_t cb); /** Get the include dirs */ std::list getIncludeDirectories(FILE *f) const; public: json_t *root; Config(); Config(const std::string &u); ~Config(); json_t * load(std::FILE *f, bool resolveIncludes = true, bool resolveEnvVars = true); json_t * load(const std::string &u, bool resolveIncludes = true, bool resolveEnvVars = true); }; } // namespace node } // namespace villas