From 53300dd1fd2b37ba85155cec7708280071a27262 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Wed, 2 Jun 2021 19:37:20 +0200 Subject: [PATCH] Implemented constraints --- Hazelnupp.vpp | Bin 747520 -> 748544 bytes Hazelnupp/Hazelnupp.cpp | 72 +++++++++++++++++++++++++++++++++--- Hazelnupp/Hazelnupp.h | 11 +++++- Hazelnupp/ParamConstraint.h | 3 +- Hazelnupp/main.cpp | 13 ++++--- 5 files changed, 85 insertions(+), 14 deletions(-) diff --git a/Hazelnupp.vpp b/Hazelnupp.vpp index 3a19a326312e70ec2089b36066bb8fd480f829da..ea050309294a006d4057241668d7b7478a7c488f 100644 GIT binary patch delta 26824 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 A%K!iX diff --git a/Hazelnupp/Hazelnupp.cpp b/Hazelnupp/Hazelnupp.cpp index 1a576e3..7fd1edf 100644 --- a/Hazelnupp/Hazelnupp.cpp +++ b/Hazelnupp/Hazelnupp.cpp @@ -52,6 +52,10 @@ void Hazelnupp::Parse(const int argc, const char* const* argv) i++; } + // Apply constraints such as default values, and required parameters. + // Types have already been enforced. + ApplyConstraints(); + return; } @@ -236,6 +240,40 @@ Value* Hazelnupp::ParseValue(const std::vector& values, const Param return nullptr; } +void Hazelnupp::ApplyConstraints() +{ + // Enforce required parameters / default values + for (const auto& pc : constraints) + // Parameter in question is not supplied + if (!HasParam(pc.second.key)) + { + // Do we have a default value? + if (pc.second.defaultValue.size() > 0) + { + // Then create it now, by its default value + + Value* tmp = ParseValue(pc.second.defaultValue, &pc.second); + parameters.insert(std::pair( + pc.second.key, + new Parameter(pc.second.key, tmp) + )); + + delete tmp; + tmp = nullptr; + } + // So we do not have a default value... + else + { + // Is it important to have the missing parameter? + if (pc.second.required) + // Throw an error message then + throw HazelnutConstraintMissmatch(); + } + } + + return; +} + const std::string& Hazelnupp::GetExecutableName() const { return executableName; @@ -262,13 +300,37 @@ bool Hazelnupp::HasAbbreviation(const std::string& abbrev) const return abbreviations.find(abbrev) != abbreviations.end(); } -void Hazelnupp::AddConstraints(const std::vector& constraints) +void Hazelnupp::ClearAbbreviations() +{ + abbreviations.clear(); + return; +} + +void Hazelnupp::RegisterConstraints(const std::vector& constraints) { for (const ParamConstraint& pc : constraints) - this->constraints.insert(std::pair( - pc.key, - pc - )); + { + // Does this constraint already exist? + const auto constraint = this->constraints.find(pc.key); + // If yes, replace it. + if (constraint != this->constraints.end()) + constraint->second = pc; + + // Else, create a new pair + else + this->constraints.insert(std::pair( + pc.key, + pc + )); + } + + return; +} + +void Hazelnupp::ClearConstraints() +{ + constraints.clear(); + return; } const ParamConstraint* Hazelnupp::GetConstraintForKey(const std::string& key) const diff --git a/Hazelnupp/Hazelnupp.h b/Hazelnupp/Hazelnupp.h index b50ed88..33e2f2a 100644 --- a/Hazelnupp/Hazelnupp.h +++ b/Hazelnupp/Hazelnupp.h @@ -34,7 +34,14 @@ public: //! Will check wether or not an abbreviation is registered bool HasAbbreviation(const std::string& abbrev) const; - void AddConstraints(const std::vector& constraints); + //! Will delete all abbreviations + void ClearAbbreviations(); + + //! Will register parameter constraints + void RegisterConstraints(const std::vector& constraints); + + //! Will delete all constraints + void ClearConstraints(); private: //! Will translate the c-like args to an std::vector @@ -49,7 +56,7 @@ private: //! Will convert a vector of string-values to an actual Value Value* ParseValue(const std::vector& values, const ParamConstraint* constraint = nullptr); - //! Will apply the loaded constraints on the loaded values. + //! Will apply the loaded constraints on the loaded values, exluding types. void ApplyConstraints(); //! Will return a pointer to a paramConstraint given a key. If there is no, it returns nullptr diff --git a/Hazelnupp/ParamConstraint.h b/Hazelnupp/ParamConstraint.h index b6b0815..dcfe7a0 100644 --- a/Hazelnupp/ParamConstraint.h +++ b/Hazelnupp/ParamConstraint.h @@ -1,6 +1,7 @@ #pragma once #include "DataType.h" #include +#include struct ParamConstraint { @@ -17,7 +18,7 @@ public: //! The default value for this parameter. //! Gets applied if this parameter was not given. - std::string defaultValue; + std::vector defaultValue; //! If set to true, and no default value set, //! an error will be produced if this parameter is not supplied by the user. diff --git a/Hazelnupp/main.cpp b/Hazelnupp/main.cpp index c338a2a..d10c39d 100644 --- a/Hazelnupp/main.cpp +++ b/Hazelnupp/main.cpp @@ -25,12 +25,13 @@ int main(int argc, char** argv) Hazelnupp args; ParamConstraint pc; - pc.key = "--word"; + pc.key = "--alfredo"; pc.constrainType = true; - pc.wantedType = DATA_TYPE::INT; + pc.wantedType = DATA_TYPE::LIST; pc.required = true; + pc.defaultValue = { "coca cola", "fanta" }; - args.AddConstraints({ + args.RegisterConstraints({ pc }); @@ -39,13 +40,13 @@ int main(int argc, char** argv) args.Parse(testArgv.size(), testArgv.data()); //args.Parse(argc, argv); - if (args.HasParam("--word")) + if (args.HasParam("--alfredo")) { - std::cout << *args["--word"] << std::endl; + std::cout << *args["--alfredo"] << std::endl; } else { - std::cout << "No --word!" << std::endl; + std::cout << "No --alfredo!" << std::endl; } }