#ifndef SIBS_CONF_HPP #define SIBS_CONF_HPP #include "Result.hpp" #include "StringView.hpp" #include "utils.hpp" #include "Dependency.hpp" #include "Package.hpp" #include #include #include #include namespace sibs { class ConfigValue { public: enum class Type { NONE, SINGLE, LIST }; ConfigValue() : type(Type::NONE) {} ConfigValue(StringView value) : type(Type::SINGLE) { values.push_back(value); } ConfigValue(const std::vector &_values) : type(Type::LIST), values(_values) { } bool isSingle() const { return type == Type::SINGLE; } bool isList() const { return type == Type::LIST; } StringView asSingle() const { assert(isSingle()); return values[0]; } const std::vector asList() const { assert(isList()); return values; } private: Type type; std::vector values; }; class Parser; class ParserException : public std::runtime_error { public: ParserException(const std::string &errMsg) : runtime_error(errMsg) { } }; class ConfigCallback { friend class Parser; public: virtual ~ConfigCallback(){} protected: virtual void processObject(StringView name) = 0; virtual void processField(StringView name, const ConfigValue &value) = 0; virtual void finished() = 0; }; class Config { public: static Result readFromFile(const char *filepath, const ConfigCallback &callback); }; enum OptimizationLevel { OPT_LEV_NONE, OPT_LEV_DEBUG, OPT_LEV_RELEASE }; const char* asString(OptimizationLevel optLevel); class SibsConfig : public ConfigCallback { public: SibsConfig(const std::string &_projectPath, OptimizationLevel _optimizationLevel = OPT_LEV_DEBUG) : projectPath(_projectPath), packageType((PackageType)-1), optimizationLevel(_optimizationLevel), finishedProcessing(false) {} virtual ~SibsConfig(){} virtual const std::string& getPackageName() const { assert(finishedProcessing); return packageName; } virtual PackageType getPackageType() const { assert(finishedProcessing); return packageType; } virtual const std::string& getTestPath() const { return testPath; } virtual const std::vector& getDependencies() const { return dependencies; } virtual const std::string& getProjectPath() const { return projectPath; } virtual const std::vector& getIncludeDirs() const { return includeDirs; } virtual OptimizationLevel getOptimizationLevel() const { return optimizationLevel; } void setPackageType(PackageType packageType) { this->packageType = packageType; } virtual bool isDefined(const std::string &name) const; virtual bool define(const std::string &name, const std::string &value); virtual const std::unordered_map& getDefines() const; protected: virtual void processObject(StringView name) override; virtual void processField(StringView name, const ConfigValue &value) override; virtual void finished() override; protected: StringView currentObject; std::string projectPath; std::string packageName; std::string testPath; PackageType packageType; std::vector dependencies; std::vector includeDirs; std::unordered_map defines; OptimizationLevel optimizationLevel; bool finishedProcessing; }; class SibsTestConfig : public SibsConfig { public: SibsTestConfig(const std::string &_projectPath) : SibsConfig(_projectPath) { packageName = "test"; } virtual ~SibsTestConfig(){} PackageType getPackageType() const override { return PackageType::EXECUTABLE; } protected: void processObject(StringView name) override; void processField(StringView name, const ConfigValue &value) override; void finished() override; }; } #endif //SIBS_CONF_HPP