From c84eb920852ae9af683e4d8419367228c890b9db Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sun, 5 Sep 2021 12:24:31 +0200 Subject: [PATCH] Compiled hazelnupp --- INCLUDE/Hazelnupp.cpp | 29 ++++- INCLUDE/Hazelnupp.h | 260 +++++++++++++++++++++--------------------- 2 files changed, 154 insertions(+), 135 deletions(-) diff --git a/INCLUDE/Hazelnupp.cpp b/INCLUDE/Hazelnupp.cpp index d4770f2..451eb88 100644 --- a/INCLUDE/Hazelnupp.cpp +++ b/INCLUDE/Hazelnupp.cpp @@ -434,6 +434,7 @@ std::string CmdArgsInterface::GenerateDocumentation() const bool required = false; bool typeIsForced = false; std::string defaultVal; + std::string incompatibilities; }; std::unordered_map paramInfos; @@ -473,19 +474,33 @@ std::string CmdArgsInterface::GenerateDocumentation() const cached.typeIsForced = it.second.constrainType; cached.type = DataTypeToString(it.second.requiredType); - std::stringstream defaultValueSs; + // Build default-value string + std::stringstream vec2str_ss; for (const std::string& s : it.second.defaultValue) { - defaultValueSs << '\'' << s << '\''; + vec2str_ss << '\'' << s << '\''; // Add a space if we are not at the last entry if ((void*)&s != (void*)&it.second.defaultValue.back()) - defaultValueSs << " "; + vec2str_ss << " "; } - cached.defaultVal = defaultValueSs.str(); + cached.defaultVal = vec2str_ss.str(); + + + // Build incompatibilities string + vec2str_ss.str(""); + for (const std::string& s : it.second.incompatibleParameters) + { + vec2str_ss << s; + + // Add a comma-space if we are not at the last entry + if ((void*)&s != (void*)&it.second.incompatibleParameters.back()) + vec2str_ss << ", "; + } + cached.incompatibilities = vec2str_ss.str(); } - // Now generate the documentatino body + // Now generate the documentation body if (paramInfos.size() > 0) { ss << std::endl @@ -512,6 +527,10 @@ std::string CmdArgsInterface::GenerateDocumentation() const if (pde.defaultVal.length() > 0) ss << "default=[" << pde.defaultVal << "] "; + // Put incompatibilities + if (pde.incompatibilities.length() > 0) + ss << "incompatibilities=[" << pde.incompatibilities << "] "; + // Put required tag, but only if no default value if ((pde.required) && (pde.defaultVal.length() == 0)) ss << "[[REQUIRED]] "; diff --git a/INCLUDE/Hazelnupp.h b/INCLUDE/Hazelnupp.h index 690c8e8..01e1900 100644 --- a/INCLUDE/Hazelnupp.h +++ b/INCLUDE/Hazelnupp.h @@ -1,5 +1,18 @@ #pragma once +/*** ../Hazelnupp/Placeholders.h ***/ + +#include + +namespace Hazelnp +{ + namespace Placeholders + { + //! The only purpose of this is to provide the ability to return an empty string as an error for std::string& methods. + static const std::string g_emptyString; + } +} + /*** ../Hazelnupp/StringTools.h ***/ #include @@ -48,20 +61,7 @@ namespace Hazelnp /*** ../Hazelnupp/Version.h ***/ -#define HAZELNUPP_VERSION (1.1) - -/*** ../Hazelnupp/Placeholders.h ***/ - -#include - -namespace Hazelnp -{ - namespace Placeholders - { - //! The only purpose of this is to provide the ability to return an empty string as an error for std::string& methods. - static const std::string g_emptyString; - } -} +#define HAZELNUPP_VERSION (1.11) /*** ../Hazelnupp/DataType.h ***/ @@ -104,6 +104,122 @@ namespace Hazelnp } } +/*** ../Hazelnupp/HazelnuppException.h ***/ + +#include +#include +#include + +namespace Hazelnp +{ + /** Generic hazelnupp exception + */ + class HazelnuppException : public std::exception + { + public: + HazelnuppException() {}; + HazelnuppException(const std::string& msg) : message{ msg } {}; + + //! Will return an error message + const std::string& What() const + { + return message; + } + + protected: + std::string message; + }; + + /** Gets thrown when an non-existent key gets dereferenced + */ + class HazelnuppInvalidKeyException : public HazelnuppException + { + public: + HazelnuppInvalidKeyException() : HazelnuppException() {}; + HazelnuppInvalidKeyException(const std::string& msg) : HazelnuppException(msg) {}; + }; + + /** Gets thrown when an attempt is made to retrieve the wrong data type from a value, when the value not convertible + */ + class HazelnuppValueNotConvertibleException : public HazelnuppException + { + public: + HazelnuppValueNotConvertibleException() : HazelnuppException() {}; + HazelnuppValueNotConvertibleException(const std::string& msg) : HazelnuppException(msg) {}; + }; + + /** Gets thrown something bad happens because of parameter constraints + */ + class HazelnuppConstraintException : public HazelnuppException + { + public: + HazelnuppConstraintException() : HazelnuppException() {}; + HazelnuppConstraintException(const std::string& msg) : HazelnuppException(msg) {}; + }; + + /** Gets thrown when a parameter is of a type that does not match the required type, and is not convertible to it + */ + class HazelnuppConstraintTypeMissmatch : public HazelnuppConstraintException + { + public: + HazelnuppConstraintTypeMissmatch() : HazelnuppConstraintException() {}; + HazelnuppConstraintTypeMissmatch(const std::string& msg) : HazelnuppConstraintException(msg) {}; + + HazelnuppConstraintTypeMissmatch(const std::string& key, const DATA_TYPE requiredType, const DATA_TYPE actualType, const std::string& paramDescription = "") + { + // Generate descriptive error message + std::stringstream ss; + ss << "Cannot convert parameter " << key << " to type " << DataTypeToString(requiredType) + << ". You supplied type: " << DataTypeToString(actualType) << "."; + + // Add the parameter description, if provided + if (paramDescription.length() > 0) + ss << std::endl << key << " => " << paramDescription; + + message = ss.str(); + return; + }; + }; + + /** Gets thrown when a parameter constrained to be required is not provided, and has no default value set + */ + class HazelnuppConstraintMissingValue : public HazelnuppConstraintException + { + public: + HazelnuppConstraintMissingValue() : HazelnuppConstraintException() {}; + HazelnuppConstraintMissingValue(const std::string& key, const std::string& paramDescription = "") + { + // Generate descriptive error message + std::stringstream ss; + ss << "Missing required parameter " << key << "."; + + // Add the parameter description, if provided + if (paramDescription.length() > 0) + ss << std::endl << key << " => " << paramDescription; + + message = ss.str(); + return; + }; + }; + + /** Gets thrown when a parameter constrained to be incompatible with other parameters gets supplied alongside at least one of those incompatible ones + */ + class HazelnuppConstraintIncompatibleParameters : public HazelnuppConstraintException + { + public: + HazelnuppConstraintIncompatibleParameters() : HazelnuppConstraintException() {}; + HazelnuppConstraintIncompatibleParameters(const std::string& key1, const std::string& key2) + { + // Generate descriptive error message + std::stringstream ss; + ss << "Parameter \"" << key1 << "\" is NOT compatible with parameter \"" << key2 << "\"!"; + + message = ss.str(); + return; + }; + }; +} + /*** ../Hazelnupp/ParamConstraint.h ***/ #include @@ -506,122 +622,6 @@ namespace Hazelnp }; } -/*** ../Hazelnupp/HazelnuppException.h ***/ - -#include -#include -#include - -namespace Hazelnp -{ - /** Generic hazelnupp exception - */ - class HazelnuppException : public std::exception - { - public: - HazelnuppException() {}; - HazelnuppException(const std::string& msg) : message{ msg } {}; - - //! Will return an error message - const std::string& What() const - { - return message; - } - - protected: - std::string message; - }; - - /** Gets thrown when an non-existent key gets dereferenced - */ - class HazelnuppInvalidKeyException : public HazelnuppException - { - public: - HazelnuppInvalidKeyException() : HazelnuppException() {}; - HazelnuppInvalidKeyException(const std::string& msg) : HazelnuppException(msg) {}; - }; - - /** Gets thrown when an attempt is made to retrieve the wrong data type from a value, when the value not convertible - */ - class HazelnuppValueNotConvertibleException : public HazelnuppException - { - public: - HazelnuppValueNotConvertibleException() : HazelnuppException() {}; - HazelnuppValueNotConvertibleException(const std::string& msg) : HazelnuppException(msg) {}; - }; - - /** Gets thrown something bad happens because of parameter constraints - */ - class HazelnuppConstraintException : public HazelnuppException - { - public: - HazelnuppConstraintException() : HazelnuppException() {}; - HazelnuppConstraintException(const std::string& msg) : HazelnuppException(msg) {}; - }; - - /** Gets thrown when a parameter is of a type that does not match the required type, and is not convertible to it - */ - class HazelnuppConstraintTypeMissmatch : public HazelnuppConstraintException - { - public: - HazelnuppConstraintTypeMissmatch() : HazelnuppConstraintException() {}; - HazelnuppConstraintTypeMissmatch(const std::string& msg) : HazelnuppConstraintException(msg) {}; - - HazelnuppConstraintTypeMissmatch(const std::string& key, const DATA_TYPE requiredType, const DATA_TYPE actualType, const std::string& paramDescription = "") - { - // Generate descriptive error message - std::stringstream ss; - ss << "Cannot convert parameter " << key << " to type " << DataTypeToString(requiredType) - << ". You supplied type: " << DataTypeToString(actualType) << "."; - - // Add the parameter description, if provided - if (paramDescription.length() > 0) - ss << std::endl << key << " => " << paramDescription; - - message = ss.str(); - return; - }; - }; - - /** Gets thrown when a parameter constrained to be required is not provided, and has no default value set - */ - class HazelnuppConstraintMissingValue : public HazelnuppConstraintException - { - public: - HazelnuppConstraintMissingValue() : HazelnuppConstraintException() {}; - HazelnuppConstraintMissingValue(const std::string& key, const std::string& paramDescription = "") - { - // Generate descriptive error message - std::stringstream ss; - ss << "Missing required parameter " << key << "."; - - // Add the parameter description, if provided - if (paramDescription.length() > 0) - ss << std::endl << key << " => " << paramDescription; - - message = ss.str(); - return; - }; - }; - - /** Gets thrown when a parameter constrained to be incompatible with other parameters gets supplied alongside at least one of those incompatible ones - */ - class HazelnuppConstraintIncompatibleParameters : public HazelnuppConstraintException - { - public: - HazelnuppConstraintIncompatibleParameters() : HazelnuppConstraintException() {}; - HazelnuppConstraintIncompatibleParameters(const std::string& key1, const std::string& key2) - { - // Generate descriptive error message - std::stringstream ss; - ss << "Parameter \"" << key1 << "\" is NOT compatible with parameter \"" << key2 << "\"!"; - - message = ss.str(); - return; - }; - }; -} - /*** ../Hazelnupp/CmdArgsInterface.h ***/ #include