From 0caba59fd32154a4bb23433444cbf2253829c663 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Mon, 30 Dec 2024 13:48:49 +0100 Subject: [PATCH] added additionalProperties to configuration --- Crafter.Build-Configuration.cpp | 104 +++++++++++++++---------------- Crafter.Build-Configuration.cppm | 2 + 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/Crafter.Build-Configuration.cpp b/Crafter.Build-Configuration.cpp index 5837406..098eafc 100644 --- a/Crafter.Build-Configuration.cpp +++ b/Crafter.Build-Configuration.cpp @@ -24,72 +24,71 @@ module; #include #include "json.hpp" #include +#include +#include module Crafter.Build:ConfigurationImpl; import :Configuration; import :Dependency; using namespace Crafter::Build; namespace fs = std::filesystem; +using namespace std::chrono; Configuration::Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir, std::string type, std::string target, std::vector dependencies): name(name), standard(standard), sourceFiles(sourceFiles), moduleFiles(moduleFiles), optimizationLevel(optimizationLevel), buildDir(buildDir), outputDir(outputDir), type(type), target(target), dependencies(dependencies) { } Configuration::Configuration(nlohmann::json& configs, nlohmann::json& config, fs::path workingDir) { - name = config["name"].get(); - if(config.contains("standard")) { - standard = config["standard"].get(); - } - if(config.contains("target")) { - target = config["target"].get(); - } - if(config.contains("type")) { - type = config["type"].get(); - } - if(config.contains("source_files")) { - const std::vector tempSourceFiles = config["source_files"].get>(); - sourceFiles = std::vector(tempSourceFiles.size()); - for(std::int_fast32_t i = 0; i < sourceFiles.size(); i++){ - std::filesystem::path filePath (tempSourceFiles[i]); - std::filesystem::path fullFilePath = workingDir / filePath; - sourceFiles[i] = fullFilePath.generic_string(); + name = config["name"].get(); + for (auto& [key, val] : config.items()) + { + if(key == "standard"){ + standard = val.get(); + } else if(key == "target") { + target = val.get(); + } else if(key == "type") { + type = val.get(); + } else if(key == "source_files") { + const std::vector tempSourceFiles = val.get>(); + sourceFiles = std::vector(tempSourceFiles.size()); + for(std::int_fast32_t i = 0; i < sourceFiles.size(); i++){ + const std::filesystem::path filePath (tempSourceFiles[i]); + const std::filesystem::path fullFilePath = workingDir / filePath; + sourceFiles[i] = fullFilePath.generic_string(); + } + } else if(key == "module_files") { + const std::vector tempModuleFiles = val.get>(); + moduleFiles = std::vector(tempModuleFiles.size()); + for(std::int_fast32_t i = 0; i < moduleFiles.size(); i++){ + const std::filesystem::path filePath (tempModuleFiles[i]); + const std::filesystem::path fullFilePath = workingDir / filePath; + moduleFiles[i] = fullFilePath.generic_string(); + } + } else if(key == "optimization_level") { + optimizationLevel = val.get(); + } else if(key == "build_dir") { + const std::string tempBuildDir = val.get(); + const std::filesystem::path buildPath (tempBuildDir); + const std::filesystem::path fullBuildPath = workingDir / buildPath; + buildDir = fullBuildPath.generic_string(); + } else if(key == "output_dir") { + const std::string tempOutputDir = val.get(); + const std::filesystem::path outputPath (tempOutputDir); + const std::filesystem::path fullOutputPath = workingDir / outputPath; + outputDir = fullOutputPath.generic_string(); + } else if(key == "dependencies") { + for (auto it : val) { + dependencies.emplace_back(val["path"].get(), val["configuration"].get()); + } + } else if(key != "extends") { + additionalProperties.insert({key, val}); } - } - if(config.contains("module_files")) { - const std::vector tempModuleFiles = config["module_files"].get>(); - moduleFiles = std::vector(tempModuleFiles.size()); - for(std::int_fast32_t i = 0; i < moduleFiles.size(); i++){ - std::filesystem::path filePath (tempModuleFiles[i]); - std::filesystem::path fullFilePath = workingDir / filePath; - moduleFiles[i] = fullFilePath.generic_string(); - } - } - if(config.contains("optimization_level")) { - optimizationLevel = config["optimization_level"].get(); - } - if(config.contains("build_dir")) { - const std::string tempBuildDir = config["build_dir"].get(); - std::filesystem::path buildPath (tempBuildDir); - std::filesystem::path fullBuildPath = workingDir / buildPath; - buildDir = fullBuildPath.generic_string(); - } - if(config.contains("output_dir")) { - const std::string tempOutputDir = config["output_dir"].get(); - std::filesystem::path outputPath (tempOutputDir); - std::filesystem::path fullOutputPath = workingDir / outputPath; - outputDir = fullOutputPath.generic_string(); - } - if(config.contains("dependencies")) { - nlohmann::json dependenciesJson = config["dependencies"]; - for (nlohmann::json::iterator it = dependenciesJson.begin(); it != dependenciesJson.end(); ++it) { - dependencies.emplace_back((*it)["path"].get(), (*it)["configuration"].get()); - } - } - if(config.contains("extends")){ + } + if(config.contains("extends")) { const std::vector extends = config["extends"].get>(); for(const std::string& extendName : extends) { - for (nlohmann::json::iterator it = configs.begin(); it != configs.end(); ++it) { - if((*it)["name"].get() == extendName){ - Configuration extendData = Configuration(configs, (*it), workingDir); + for (auto it : configs) { + if(it["name"].get() == extendName) { + Configuration extendData = Configuration(configs, it, workingDir); if(!extendData.standard.empty() && standard.empty()){ standard = extendData.standard; } @@ -123,3 +122,4 @@ Configuration::Configuration(nlohmann::json& configs, nlohmann::json& config, fs } } } + diff --git a/Crafter.Build-Configuration.cppm b/Crafter.Build-Configuration.cppm index 2a6383b..1865f3b 100644 --- a/Crafter.Build-Configuration.cppm +++ b/Crafter.Build-Configuration.cppm @@ -23,6 +23,7 @@ module; #include #include #include "json.hpp" +#include export module Crafter.Build:Configuration; import :Dependency; @@ -41,6 +42,7 @@ export namespace Crafter::Build { std::string type; std::string target; std::vector dependencies; + std::unordered_map additionalProperties; Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir, std::string type, std::string target, std::vector dependencies); Configuration(nlohmann::json& configs, nlohmann::json& config, fs::path workingDir); };