13#include <QCoreApplication>
18#include <mach-o/dyld.h>
28QMap<QString, QString> Params::params = QMap<QString, QString>();
29QString Params::appPath =
"";
30QString Params::appName =
"";
35bool Params::isEndable(
const QString& key) {
36 return params.contains(key);
39void Params::log(
const QString &log,
VerboseLvl vLvl) {
41 auto lvl = getVerboseLvl();
46 case VerboseLvl::Error:
47 qCritical().noquote() << log;
50 case VerboseLvl::Warning: {
51 qWarning().noquote() << log;
54 case VerboseLvl::Debug: {
55 qDebug().noquote() << log;
59 case VerboseLvl::Info:
61 qInfo().noquote() << log;
75bool Params::isDebug() {
76 return getVerboseLvl() >= VerboseLvl::Debug;
79bool Params::isDebugBuild() {
87void Params::showHelp() {
89 if (inputOptions.size() > 1) {
90 showHelpForInputOptions();
96void Params::showHelpForInputOptions() {
102 if (inputOptions.size() <= 1 ) {
107 for (
const auto &optionData: std::as_const(inputOptions) ) {
108 help.unite(optionData.toHelp());
111 return Help::Section{{
"Information about using options", help}};
118const QMap<QString, QString>& Params::getUserParamsMap() {
122void Params::clearParsedData() {
128QString Params::getCurrentExecutable() {
129 return getCurrentExecutableDir() +
"/" + appName;
132QString Params::getCurrentExecutableDir() {
141 {
"-verbose"},
"(level 1 - 3)",
"Shows debug log"
148 {
"-fileLog"},
"(path to file)",
"Sets path of log file. Default it is path to executable file with suffix '.log'"
155 return params.size();
158bool Params::optionsForEach(
const QStringList ¶msArray,
161 for (
int i = 0 ; i < paramsArray.size(); ++i) {
163 QStringList virtualOptionsList = paramsArray[i].split(
'=');
165 if (virtualOptionsList.size() > 1) {
166 return optionsForEach(virtualOptionsList, availableOptions);
169 auto optionData = availableOptions.value(paramsArray[i], {{}});
170 if (!checkOption(optionData, paramsArray[i])) {
174 inputOptions.insert(paramsArray[i], optionData);
176 if (paramsArray[i][0] ==
'-') {
178 if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] !=
'-') {
179 params[paramsArray[i].mid(1)] = paramsArray[i + 1];
182 qCritical() <<
"Missing argument for " + paramsArray[i];
186 params[paramsArray[i]] =
"";
193bool Params::parseParams(
const int argc,
const char *argv[],
const OptionsDataList& options) {
196 for (
int i = 1; i < argc; i++) {
197 params.push_back(argv[i]);
200 return parseParams(params, options);
203bool Params::parseParams(
int argc,
char *argv[],
const OptionsDataList& options) {
204 return parseParams(argc,
const_cast<const char**
>(argv), options);
207bool Params::parseParams(
const QStringList ¶msArray,
const OptionsDataList &options) {
211 parseAvailableOptions(
OptionsDataList{}.unite(options).unite(availableArguments()),
216 char buffer[MAX_PATH];
217 memset(buffer, 0,
sizeof buffer);
219 GetModuleFileNameA(
nullptr, buffer, MAX_PATH);
220 appPath = QFileInfo(buffer).absolutePath();
221 appName = QFileInfo(buffer).fileName();
226 memset(path, 0,
sizeof path);
228 if (readlink(
"/proc/self/exe", path, 2048) < 0) {
229 qCritical() <<
"parseParams can't get self path!";
232 appPath = QFileInfo(path).absolutePath();
233 appName = QFileInfo(path).fileName();
238 _NSGetExecutablePath(
nullptr, &size);
239 std::vector<char> buffer(size);
240 if (_NSGetExecutablePath(buffer.data(), &size) == 0) {
241 appPath = QString::fromUtf8(buffer.data());
246 appName = QCoreApplication::applicationName();
249 if (!appPath.size()) {
253 if (!optionsForEach(paramsArray, availableOptions)) {
257 printWorkingOptions();
262void Params::printWorkingOptions() {
263 qDebug() <<
"--- Working options table start ---";
265 QMap<QString, QString>::const_iterator iter = params.constBegin();
266 while (iter != params.constEnd()) {
268 QString row = QString{
"Option[%0]"}.arg(iter.key());
270 QString value = iter.value();
271 if (!value.isEmpty()) {
272 row += QString{
": %1"}.arg(value);
280 qDebug() <<
"--- Working options table end ---";
283bool Params::checkOption(
const OptionData& optionData,
const QString& rawOptionName) {
285#ifndef QA_ALLOW_NOT_SUPPORTED_OPTIONS
288 qCritical() << QString(
"The '%0' option not exists!"
289 " You use wrong option name,"
290 " please check the help before run your commnad.").
296 Q_UNUSED(rawOptionName);
309 qWarning() << QString(
"The %0 option(s) marked as deprecated! "
310 "And most likely will be removed in next release.").
311 arg(optionData.
names().join(
"/"));
313 qWarning() << QString(
"Option message: %0").arg(optionData.
depricatedMsg());
320void Params::parseAvailableOptions(
const OptionsDataList &availableOptionsListIn,
324 if (!(availableOptionsListOut && helpOut))
329 QHash<QString, Help::Options> options;
330 for (
auto it = availableOptionsListIn.begin(); it != availableOptionsListIn.end(); ++it) {
332 if (availableOptionsListOut) {
333 for (
const auto &name : std::as_const(it.value().names())) {
334 availableOptionsListOut->insert(name, it.value());
339 options[it.key()].unite(it.value().toHelp());
343 for (
auto it = options.begin(); it != options.end(); ++it) {
344 helpOut->insert(it.key(), it.value());
348QString Params::getArg(
const QString& key,
const QString& def) {
349 return params.value(key, def);
352void Params::setArg(
const QString &key,
const QString &val) {
353 params.insert(key, val);
356void Params::setEnable(
const QString &key,
bool enable) {
358 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