Rework how the config file is read
Still need to remove reduntant code and test it much more thoroughly.
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
#pragma once
|
||||
|
||||
#include "Common.h"
|
||||
#include "FileUtils.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
struct ConfigCache
|
||||
{
|
||||
std::map<std::string, std::string> strings;
|
||||
std::map<std::string, std::vector<std::string>> vecStrings;
|
||||
std::map<std::string, bool> bools;
|
||||
};
|
||||
|
||||
enum class ConfigSetting
|
||||
{
|
||||
// vectors
|
||||
Library = 0, LibraryDir = 1, IncludeDir = 2, Define = 3, CFlag = 4, Dependency = 5,
|
||||
// Strings
|
||||
SourceDir = 32, OutputDir = 33, OutputName = 34, OutputType = 35, ProjectName = 36, HFileName = 37,
|
||||
// Bools
|
||||
GenerateHFile = 64,
|
||||
// Other
|
||||
Invalid = 1024
|
||||
};
|
||||
|
||||
struct ConfigUtils
|
||||
{
|
||||
static std::string GetSettingName(ConfigSetting setting)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::SourceDir:
|
||||
return "srcdir";
|
||||
case ConfigSetting::OutputDir:
|
||||
return "outputdir";
|
||||
case ConfigSetting::OutputName:
|
||||
return "outputname";
|
||||
case ConfigSetting::OutputType:
|
||||
return "outputtype";
|
||||
case ConfigSetting::ProjectName:
|
||||
return "projectname";
|
||||
case ConfigSetting::HFileName:
|
||||
return "hfilename";
|
||||
case ConfigSetting::LibraryDir:
|
||||
return "librarydir";
|
||||
case ConfigSetting::IncludeDir:
|
||||
return "includedir";
|
||||
case ConfigSetting::Dependency:
|
||||
return "dependency";
|
||||
case ConfigSetting::Library:
|
||||
return "library";
|
||||
case ConfigSetting::Define:
|
||||
return "define";
|
||||
case ConfigSetting::CFlag:
|
||||
return "cflag";
|
||||
case ConfigSetting::GenerateHFile:
|
||||
return "generatehfile";
|
||||
case ConfigSetting::Invalid:
|
||||
return "invalid";
|
||||
}
|
||||
}
|
||||
|
||||
static bool IsDirectory(ConfigSetting setting)
|
||||
{
|
||||
// Library, LibraryDir, IncludeDir, Define, CFlag, Dependency,
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::SourceDir:
|
||||
case ConfigSetting::OutputDir:
|
||||
case ConfigSetting::LibraryDir:
|
||||
case ConfigSetting::IncludeDir:
|
||||
case ConfigSetting::Dependency:
|
||||
return true;
|
||||
case ConfigSetting::OutputName:
|
||||
case ConfigSetting::OutputType:
|
||||
case ConfigSetting::ProjectName:
|
||||
case ConfigSetting::HFileName:
|
||||
case ConfigSetting::Library:
|
||||
case ConfigSetting::Define:
|
||||
case ConfigSetting::CFlag:
|
||||
case ConfigSetting::GenerateHFile:
|
||||
return false;
|
||||
default:
|
||||
LOG_ERROR("INVALID ENUM: ", (int)setting);
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
static bool IsStringSetting(ConfigSetting setting)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::SourceDir:
|
||||
case ConfigSetting::OutputDir:
|
||||
case ConfigSetting::OutputName:
|
||||
case ConfigSetting::OutputType:
|
||||
case ConfigSetting::ProjectName:
|
||||
case ConfigSetting::HFileName:
|
||||
return true;
|
||||
case ConfigSetting::LibraryDir:
|
||||
case ConfigSetting::IncludeDir:
|
||||
case ConfigSetting::Dependency:
|
||||
case ConfigSetting::Library:
|
||||
case ConfigSetting::Define:
|
||||
case ConfigSetting::CFlag:
|
||||
case ConfigSetting::GenerateHFile:
|
||||
case ConfigSetting::Invalid:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool IsVectorSetting(ConfigSetting setting)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::LibraryDir:
|
||||
case ConfigSetting::IncludeDir:
|
||||
case ConfigSetting::Dependency:
|
||||
case ConfigSetting::Library:
|
||||
case ConfigSetting::Define:
|
||||
case ConfigSetting::CFlag:
|
||||
return true;
|
||||
case ConfigSetting::SourceDir:
|
||||
case ConfigSetting::OutputDir:
|
||||
case ConfigSetting::OutputName:
|
||||
case ConfigSetting::OutputType:
|
||||
case ConfigSetting::ProjectName:
|
||||
case ConfigSetting::HFileName:
|
||||
case ConfigSetting::GenerateHFile:
|
||||
case ConfigSetting::Invalid:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
static bool IsBoolSetting(ConfigSetting setting)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::GenerateHFile:
|
||||
return true;
|
||||
case ConfigSetting::SourceDir:
|
||||
case ConfigSetting::OutputDir:
|
||||
case ConfigSetting::OutputName:
|
||||
case ConfigSetting::OutputType:
|
||||
case ConfigSetting::ProjectName:
|
||||
case ConfigSetting::HFileName:
|
||||
case ConfigSetting::LibraryDir:
|
||||
case ConfigSetting::IncludeDir:
|
||||
case ConfigSetting::Dependency:
|
||||
case ConfigSetting::Library:
|
||||
case ConfigSetting::Define:
|
||||
case ConfigSetting::CFlag:
|
||||
case ConfigSetting::Invalid:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static std::string GetDefaultSettingString(ConfigSetting setting, const std::string& path)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::SourceDir:
|
||||
return "src/";
|
||||
case ConfigSetting::OutputDir:
|
||||
return "bin/";
|
||||
case ConfigSetting::OutputName:
|
||||
return GetDefaultOutputName(path);
|
||||
case ConfigSetting::OutputType:
|
||||
return "executable";
|
||||
case ConfigSetting::ProjectName:
|
||||
return GetDefaultProjectName(path);
|
||||
case ConfigSetting::HFileName:
|
||||
return GetDefaultHFileName(path);
|
||||
case ConfigSetting::GenerateHFile:
|
||||
return GetDefaultSettingBool(setting) ? "true" : "false";
|
||||
default:
|
||||
LOG_ERROR("INVALID STRING ENUM: ", (int)setting);
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
static bool GetDefaultSettingBool(ConfigSetting setting)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case ConfigSetting::GenerateHFile:
|
||||
return false;
|
||||
default:
|
||||
LOG_ERROR("NOT BOOLEAN VALUE: ", (int)setting);
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
static std::string GetDefaultProjectName(const std::string& path)
|
||||
{
|
||||
return FileUtils::GetTopDirectory(path);
|
||||
}
|
||||
|
||||
static std::string GetDefaultOutputName(const std::string& path)
|
||||
{
|
||||
std::string projectname = GetDefaultProjectName(path);
|
||||
std::string outputname;
|
||||
std::transform(
|
||||
projectname.begin(),
|
||||
projectname.end(),
|
||||
std::back_inserter(outputname),
|
||||
[](unsigned char c)
|
||||
{
|
||||
if(c == ' ')
|
||||
return '_';
|
||||
return (char)std::tolower(c);
|
||||
});
|
||||
auto it = std::remove_if(
|
||||
outputname.begin(),
|
||||
outputname.end(),
|
||||
[](unsigned char c)
|
||||
{
|
||||
return (c < '0' || c > '9') && (c < 'a' || c > 'z') && c != '_';
|
||||
});
|
||||
outputname.erase(it, outputname.end());
|
||||
outputname += ".out";
|
||||
return outputname;
|
||||
}
|
||||
|
||||
static std::string GetDefaultHFileName(const std::string& path)
|
||||
{
|
||||
std::string hfile = GetDefaultProjectName(path);
|
||||
auto it = std::remove_if(
|
||||
hfile.begin(),
|
||||
hfile.end(),
|
||||
[](unsigned char c)
|
||||
{
|
||||
return (c < 'a' || c > 'z') && (c < 'A' || c > 'Z');
|
||||
});
|
||||
hfile.erase(it, hfile.end());
|
||||
hfile += ".h";
|
||||
return hfile;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user