// Copyright(c) 2017-2018 Alejandro Sirgo Rica & Contributors
//
// This file is part of Flameshot.
//
// Flameshot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Flameshot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Flameshot. If not, see .
#pragma once
#include "src/cli/commandargument.h"
#include "src/cli/commandoption.h"
#include
class CommandLineParser {
public:
CommandLineParser();
bool parse(const QStringList &args);
CommandArgument rootArgument() const { return CommandArgument(); }
CommandOption addVersionOption();
CommandOption addHelpOption();
bool AddArgument(const CommandArgument &arg,
const CommandArgument &parent = CommandArgument());
bool AddOption(const CommandOption &option,
const CommandArgument &parent = CommandArgument());
bool AddOptions(const QList &options,
const CommandArgument &parent = CommandArgument());
void setGeneralErrorMessage(const QString &msg);
void setDescription(const QString &description);
bool isSet(const CommandArgument &arg) const;
bool isSet(const CommandOption &option) const;
QString value(const CommandOption &option) const;
private:
bool m_withHelp = false;
bool m_withVersion = false;
QString m_description;
QString m_generalErrorMessage;
struct Node {
explicit Node(const CommandArgument &arg) : argument(arg) {}
Node() {}
bool operator==(const Node &n) const {
return argument == n.argument &&
options == n.options &&
subNodes == n.subNodes;
}
CommandArgument argument;
QList options;
QList subNodes;
};
Node m_parseTree;
QList m_foundOptions;
QList m_foundArgs;
// helper functions
void printVersion();
void printHelp(QStringList args, const Node *node);
Node* findParent(const CommandArgument &parent);
Node* recursiveParentSearch(const CommandArgument &parent,
Node &node) const;
bool processIfOptionIsHelp(const QStringList &args,
QStringList::const_iterator &actualIt,
Node * &actualNode);
bool processArgs(const QStringList &args,
QStringList::const_iterator &actualIt,
Node * &actualNode);
bool processOptions(const QStringList &args,
QStringList::const_iterator &actualIt,
Node *const actualNode);
};