#pragma once #include #include #include #include #include "ConfigUtils.h" #include "Dependency.h" #include "FlagData.h" #include "xml/XMLObject.h" static const std::string CONFIG_FILENAME = "makegen.xml"; class ConfigFile { private: ConfigCache cache; XMLObject config; // Current configuration std::string target; std::string configPath; std::vector dependencyConfigs; std::vector dependencies; bool hasInitError = false; public: // Generates a new default config file ConfigFile(const std::string& path, const FlagData& flagData, int); ConfigFile(const std::string& path, const FlagData& flagData); ConfigFile(XMLObject& config, const std::string& path, const FlagData& flagData); void Save() const; std::string& GetSettingString(ConfigSetting setting); bool GetSettingBool(ConfigSetting setting); std::vector& GetSettingVectorString(ConfigSetting setting); std::vector GetSetting(ConfigSetting setting); const std::vector& GetDependencies() const; bool SetSettingString(ConfigSetting setting, const std::string& value); bool AddSettingVectorString(ConfigSetting setting, const std::string& value); bool RemoveSettingVectorString(ConfigSetting setting, const std::string& value); XMLObject& GetConfiguration(); const std::string& GetConfigPath() const; ConfigFile& GetDependencyConfig(size_t i); private: void Init(const FlagData& flagData); void InitDependencies(); public: static ConfigFile Gen(const FlagData& flagData); static std::optional GetConfigFile(const std::string& filepath, const FlagData& flagData); private: static std::optional GetConfigFile(const std::string& filepath, std::map& loadedConfigs, const FlagData& flagData); static std::optional Load(const std::string& filename); static void InputBoolean(const std::string& inputText, bool& b); static void InputMultiple(const std::string& inputText, std::vector& vec, bool needEnding); static void InputString(const std::string& inputText, std::string& vec, bool needEnding, bool allowEmpty); };