diff --git a/helpdata.cpp b/helpdata.cpp index f88ee07..3dccf22 100644 --- a/helpdata.cpp +++ b/helpdata.cpp @@ -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; diff --git a/optiondata.cpp b/optiondata.cpp index b72ed5b..35cf1ea 100644 --- a/optiondata.cpp +++ b/optiondata.cpp @@ -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(); } } diff --git a/params.cpp b/params.cpp index d6ae249..81a4ac1 100644 --- a/params.cpp +++ b/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) { diff --git a/params.h b/params.h index 1dc3e82..7ac1f0b 100644 --- a/params.h +++ b/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;