13#include <QCoreApplication>
23QMap<QString, QString> Params::params = QMap<QString, QString>();
24QString Params::appPath =
"";
25QString Params::appName =
"";
30bool Params::isEndable(
const QString& key) {
31 return params.contains(key);
34void Params::log(
const QString &log,
VerboseLvl vLvl) {
36 auto lvl = getVerboseLvl();
41 case VerboseLvl::Error:
42 qCritical().noquote() << log;
45 case VerboseLvl::Warning: {
46 qWarning().noquote() << log;
49 case VerboseLvl::Debug: {
50 qDebug().noquote() << log;
54 case VerboseLvl::Info:
56 qInfo().noquote() << log;
70bool Params::isDebug() {
71 return getVerboseLvl() >= VerboseLvl::Debug;
74bool Params::isDebugBuild() {
82void Params::showHelp() {
84 if (inputOptions.size() > 1) {
85 showHelpForInputOptions();
91void Params::showHelpForInputOptions() {
97 if (inputOptions.size() <= 1 ) {
102 for (
const auto &optionData: std::as_const(inputOptions) ) {
103 help.unite(optionData.toHelp());
106 return Help::Section{{
"Information about using options", help}};
113const QMap<QString, QString>& Params::getUserParamsMap() {
117void Params::clearParsedData() {
123QString Params::getCurrentExecutable() {
124 return getCurrentExecutableDir() +
"/" + appName;
127QString Params::getCurrentExecutableDir() {
136 {
"-verbose"},
"(level 1 - 3)",
"Shows debug log"
143 {
"-fileLog"},
"(path to file)",
"Sets path of log file. Default it is path to executable file with suffix '.log'"
150 return params.size();
153bool Params::optionsForEach(
const QStringList ¶msArray,
156 for (
int i = 0 ; i < paramsArray.size(); ++i) {
158 QStringList virtualOptionsList = paramsArray[i].split(
'=');
160 if (virtualOptionsList.size() > 1) {
161 return optionsForEach(virtualOptionsList, availableOptions);
164 auto optionData = availableOptions.value(paramsArray[i], {{}});
165 if (!checkOption(optionData, paramsArray[i])) {
169 inputOptions.insert(paramsArray[i], optionData);
171 if (paramsArray[i][0] ==
'-') {
173 if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] !=
'-') {
174 params[paramsArray[i].mid(1)] = paramsArray[i + 1];
177 qCritical() <<
"Missing argument for " + paramsArray[i];
181 params[paramsArray[i]] =
"";
188bool Params::parseParams(
const int argc,
const char *argv[],
const OptionsDataList& options) {
191 for (
int i = 1; i < argc; i++) {
192 params.push_back(argv[i]);
195 return parseParams(params, options);
198bool Params::parseParams(
int argc,
char *argv[],
const OptionsDataList& options) {
199 return parseParams(argc,
const_cast<const char**
>(argv), options);
202bool Params::parseParams(
const QStringList ¶msArray,
const OptionsDataList &options) {
206 parseAvailableOptions(
OptionsDataList{}.unite(options).unite(availableArguments()),
211 char buffer[MAX_PATH];
212 memset(buffer, 0,
sizeof buffer);
214 GetModuleFileNameA(
nullptr, buffer, MAX_PATH);
215 appPath = QFileInfo(buffer).absolutePath();
216 appName = QFileInfo(buffer).fileName();
221 memset(path, 0,
sizeof path);
223 if (readlink(
"/proc/self/exe", path, 2048) < 0) {
224 qCritical() <<
"parseParams can't get self path!";
227 appPath = QFileInfo(path).absolutePath();
228 appName = QFileInfo(path).fileName();
232 appPath = QCoreApplication::applicationDirPath();
233 appName = QCoreApplication::applicationName();
236 if (!appPath.size()) {
240 if (!optionsForEach(paramsArray, availableOptions)) {
244 printWorkingOptions();
249void Params::printWorkingOptions() {
250 qDebug() <<
"--- Working options table start ---";
252 QMap<QString, QString>::const_iterator iter = params.constBegin();
253 while (iter != params.constEnd()) {
255 QString row = QString{
"Option[%0]"}.arg(iter.key());
257 QString value = iter.value();
258 if (!value.isEmpty()) {
259 row += QString{
": %1"}.arg(value);
267 qDebug() <<
"--- Working options table end ---";
270bool Params::checkOption(
const OptionData& optionData,
const QString& rawOptionName) {
272#ifndef QA_ALLOW_NOT_SUPPORTED_OPTIONS
275 qCritical() << QString(
"The '%0' option not exists!"
276 " You use wrong option name,"
277 " please check the help before run your commnad.").
283 Q_UNUSED(rawOptionName);
296 qWarning() << QString(
"The %0 option(s) marked as deprecated! "
297 "And most likely will be removed in next release.").
298 arg(optionData.
names().join(
"/"));
300 qWarning() << QString(
"Option message: %0").arg(optionData.
depricatedMsg());
307void Params::parseAvailableOptions(
const OptionsDataList &availableOptionsListIn,
311 if (!(availableOptionsListOut && helpOut))
316 QHash<QString, Help::Options> options;
317 for (
auto it = availableOptionsListIn.begin(); it != availableOptionsListIn.end(); ++it) {
319 if (availableOptionsListOut) {
320 for (
const auto &name : std::as_const(it.value().names())) {
321 availableOptionsListOut->insert(name, it.value());
326 options[it.key()].unite(it.value().toHelp());
330 for (
auto it = options.begin(); it != options.end(); ++it) {
331 helpOut->insert(it.key(), it.value());
335QString Params::getArg(
const QString& key,
const QString& def) {
336 return params.value(key, def);
339void Params::setArg(
const QString &key,
const QString &val) {
340 params.insert(key, val);
343void Params::setEnable(
const QString &key,
bool enable) {
345 params.insert(key,
"");
The OptionData class contains information about one option.
bool isDepricated() const
isDepricated This method return true if this option is depricated.
bool isValid() const
isValid This method return true if the option is valid. If option do not contain a name then it is in...
const QString & depricatedMsg() const
depricatedWarning This is a message that will be printed as a warning if user will use this option....
bool isRemoved() const
isRemoved This method return true if the option is removed.
const QStringList & names() const
name This is name of the option. It is a required argument and cannot be empty.
QMultiMap< QString, QString > Options
Options this is list of key-descriptions pairs of help. The key is name of the available argument and...
void print(const QString &key, const QString &value, int keyLength)
QMultiMap< QString, Options > Section
Section This is list of the help Sections. The one section it is Title of the section and Help::Optio...
The QuasaraAppUtils class This lib include base functions for the all applications of QuasarApp group...
QMultiHash< QString, OptionData > OptionsDataList
OptionsList is Hash map of the OptionData items. Where the key it is group name and value it is optio...
VerboseLvl
The VerboseLvl enum uses for sets log level.
#define DEFAULT_VERBOSE_LVL