added support validation wrong options

This commit is contained in:
Andrei Yankovich 2021-07-28 12:38:44 +03:00
parent 93839d1dc0
commit cae874728f
4 changed files with 121 additions and 27 deletions

View File

@ -20,7 +20,7 @@ namespace QuasarAppUtils {
namespace Help {
static int MAX_LENGTH = -1;
static int SectionMargin = 3;
static int SectionMargin = 2;
#define EXPANDER(COUNT, ITEM) QString(COUNT, ITEM).toStdString()
#define SPACES(X) EXPANDER(X, ' ')
@ -43,7 +43,7 @@ void print(const QString& key, const QString& value, int keyLength) {
QString expander(keyLength + SectionMargin, ' ');
auto words = value.split(" ");
int currentLength = keyLength;
int currentLength = std::max(keyLength, key.size());
for (const auto& word : words) {
if (currentLength + 2 + word.size() < WIDTH) {
std::cout << " " << word.toStdString();
@ -66,6 +66,8 @@ void print(const QuasarAppUtils::Help::Options &oprionsList) {
maxLength = line.key().size();
}
maxLength = std::min(WIDTH / 3, maxLength);
for (auto line = oprionsList.begin(); line != oprionsList.end(); ++line) {
print(line.key(), line.value(), maxLength + SectionMargin);
std::cout << std::endl;

View File

@ -75,6 +75,17 @@ bool OptionData::isDepricated() const {
}
Help::Options OptionData::toHelp() const {
return {{{names().join(" / ") + " " + arguments()}, {description() + " " + example()}}};
QString left = names().join(" / ") + " " + arguments();
QString right = description();
if (example().size()) {
right += " Example: " + example();
}
return {{left, {right}}};
}
bool OptionData::isValid() const {
return names().size();
}
}

View File

@ -25,6 +25,7 @@ QMap<QString, QString> Params::params = QMap<QString, QString>();
QString Params::appPath = "";
QString Params::appName = "";
Help::Section Params::userHelp = {};
OptionsDataList Params::inputOptions = {};
bool Params::isEndable(const QString& key) {
@ -73,8 +74,33 @@ bool Params::isDebugBuild() {
#endif
}
void Params::showHelp() {
Help::print(userHelp);
void Params::showHelp(const QString &option) {
if (userHelp.contains(option))
Help::print(userHelp.value(option));
else
Help::print(userHelp);
}
void Params::showHelpForInputOptions() {
Help::print(getHelpOfInputOptions());
}
Help::Section Params::getHelpOfInputOptions() {
if (inputOptions.size() <= 1 ) {
return {};
}
Help::Options help;
for (const auto &optionData: qAsConst(inputOptions) ) {
help.unite(optionData.toHelp());
}
return Help::Section{{"Information about using options", help}};
}
const Help::Section &Params::getHelp() {
return userHelp;
}
const QMap<QString, QString>& Params::getUserParamsMap() {
@ -102,6 +128,7 @@ OptionsDataList Params::availableArguments() {
OptionData{
{"-verbose"}, "(level 1 - 3)", "Shows debug log"
}
},
{
"Base Options",
@ -224,27 +251,11 @@ bool Params::parseParams(const QStringList &paramsArray, const OptionsDataList &
for (int i = 0 ; i < paramsArray.size(); ++i) {
auto optionData = availableOptions.value(paramsArray[i], {{}});
if (!optionData.isValid()) {
QuasarAppUtils::Params::log("You use wrong option name, please check the help before run your commnad.",
QuasarAppUtils::Error);
if (options.size() && !checkOption(optionData, paramsArray[i])) {
return false;
}
if (optionData.isDepricated()) {
if (optionData.isRemoved()) {
QuasarAppUtils::Params::log(optionData.depricatedMsg(),
QuasarAppUtils::Error);
return false;
}
QuasarAppUtils::Params::log(optionData.depricatedMsg(),
QuasarAppUtils::Warning);
}
inputOptions.insert(paramsArray[i], optionData);
if (paramsArray[i][0] == '-') {
if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] != '-') {
@ -288,6 +299,33 @@ void Params::printWorkingOptions() {
QuasarAppUtils::Debug);
}
bool Params::checkOption(const OptionData& optionData, const QString& rawOptionName) {
if (!optionData.isValid()) {
QuasarAppUtils::Params::log(QString("The '%0' option not exists!"
" You use wrong option name, please check the help before run your commnad.").arg(
rawOptionName),
QuasarAppUtils::Error);
return false;
}
if (optionData.isDepricated()) {
if (optionData.isRemoved()) {
QuasarAppUtils::Params::log(optionData.depricatedMsg(),
QuasarAppUtils::Error);
return false;
}
QuasarAppUtils::Params::log(optionData.depricatedMsg(),
QuasarAppUtils::Warning);
}
return true;
}
void Params::parseAvailableOptions(const OptionsDataList &availableOptionsListIn,
OptionsDataList *availableOptionsListOut,
Help::Section *helpOut) {
@ -295,6 +333,8 @@ void Params::parseAvailableOptions(const OptionsDataList &availableOptionsListIn
if (!(availableOptionsListOut && helpOut))
return;
helpOut->clear();
QHash<QString, Help::Options> options;
for (auto it = availableOptionsListIn.begin(); it != availableOptionsListIn.end(); ++it) {

View File

@ -53,24 +53,30 @@ public:
* @brief parseParams Parse input data of started application.
* @param argc Count of arguments.
* @param argv Array of arguments.
* @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/
static bool parseParams(const int argc, const char *argv[], const OptionsDataList& options);
static bool parseParams(const int argc, const char *argv[], const OptionsDataList& options = {});
/**
* @brief parseParams Parse input data of started application.
* @param argc Count of arguments.
* @param argv Array of arguments.
* @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/
static bool parseParams(int argc, char *argv[], const OptionsDataList& options);
static bool parseParams(int argc, char *argv[], const OptionsDataList& options = {});
/**
* @brief parseParams Parse input data of started application.
* @param paramsArray Arguments.
* @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/
static bool parseParams(const QStringList& paramsArray, const OptionsDataList& options);
static bool parseParams(const QStringList& paramsArray, const OptionsDataList& options = {});
/**
* @brief getArg return string value of a @a key if key is exits else return a @a def value.
@ -138,8 +144,34 @@ public:
/**
* @brief showHelp This method shows all help message.
* @param option This is option key that needed show a help message.
*/
static void showHelp();
static void showHelp(const QString& option = "");
/**
* @brief showHelpForInputOptions This method show help for each input option.
* @note Befor using of this method invoke the parseParams method. This is needed for generate the help message.
*
* **Example:**
*
* ```bash
* myTool help option1 -option2 argumets
* ```
*/
static void showHelpForInputOptions();
/**
* @brief getHelpOfInputOptions This method return help abut input options only. Exept help and h options.
* @return help abut input options only. Exept help and h options.
*/
static Help::Section getHelpOfInputOptions();
/**
* @brief getHelp This method return options help page.
* @note Befor using of this method invoke the parseParams method. This is needed for generate the help message.
* @return help of available options.
*/
static const Help::Section& getHelp();
/**
* @brief getUserParamsMap This method return const reference to the parsed arguments map.
@ -182,6 +214,13 @@ private:
*/
static void printWorkingOptions();
/**
* @brief checkOption return tru if the option is supported
* @param option checked option
* @return true if option is supported
*/
static bool checkOption(const OptionData &option, const QString &rawOptionName);
/**
* @brief parseAvailableOptions This is private method for parsing availabel options.
* @param availableOptionsListIn input data of the available options.
@ -194,6 +233,8 @@ private:
static QMap<QString, QString> params;
static OptionsDataList inputOptions;
static Help::Section userHelp;
static QString appPath;
static QString appName;