mirror of
https://github.com/QuasarApp/QuasarAppLib.git
synced 2025-04-26 17:54:40 +00:00
added support validation wrong options
This commit is contained in:
parent
93839d1dc0
commit
cae874728f
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
80
params.cpp
80
params.cpp
@ -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 ¶msArray, 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) {
|
||||
|
||||
|
49
params.h
49
params.h
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user