WsParser_VS/ArgsParser/argsparser.h

177 lines
3.7 KiB
C++

#pragma once
#include <memory>
#include <QString>
#include <QList>
#include <qHash>
#include <tuple>
#include "argsparser_global.h"
namespace args_parse {
/**
* 参数类型.
*/
enum class ParamType {
IndexParam,
FloatParam,
};
/**
* @brief 命令行参数包.
*/
class IArgvPack {
public:
virtual ~IArgvPack() = default;
/**
* 参数包类型.
*
* \return
*/
virtual ParamType paramType() const = 0;
/**
* @brief 参数解释.
*
* \return 解释
*/
virtual QString means() const = 0;
virtual QString placeHolder() const = 0;
virtual QString value() const = 0;
/**
* @brief 匹配长度.
*
* \return 长度
*/
virtual int matchLenth() const = 0;
/**
* @brief 解析.
*
* \param argv 输入
* \param start 起始解析
* \return 匹配成功
*/
virtual bool parse(const QList<QString> args, int start) = 0;
};
class ARGSPARSER_EXPORT __ArgvPackImpls : public IArgvPack {
private:
QString means_store;
QString value_store;
ParamType type_store;
public:
__ArgvPackImpls(const QString &means, ParamType t);
void setValue(const QString &v);
// 通过 IArgvPack 继承
ParamType paramType() const override;
QString means() const override;
QString value() const override;
};
class ARGSPARSER_EXPORT __FloatArgvImpl : public __ArgvPackImpls {
private:
QString key_name;
bool optional_value;
public:
explicit __FloatArgvImpl(const QString& key, const QString& means, bool optional);
QString bindKey() const;
virtual bool optional() const;
};
/**
* @brief 命令行key-value解析匹配模式.
* --key value
*/
class ARGSPARSER_EXPORT FloatKeyValue : public __FloatArgvImpl {
public:
/**
* 浮动key-value解析单元.
*
* \param key 键名
* \param means 参数解释
* \param optional 是否可选
*/
explicit FloatKeyValue(const QString& key, const QString &means, bool optional = false);
virtual ~FloatKeyValue() = default;
virtual QString placeHolder() const override;
virtual int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
/**
* @brief 命令行key解析匹配模式.
* --key
*/
class ARGSPARSER_EXPORT FloatOption : public __FloatArgvImpl {
public:
/**
* 浮动option解析单元.
*
* \param key 键名
* \param means 参数解释
* \param optional 是否可选
*/
explicit FloatOption(const QString& key, const QString& means, bool optional = false);
virtual ~FloatOption() = default;
virtual QString placeHolder() const override;
virtual int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
/**
* 序列索引参数.
*/
class ARGSPARSER_EXPORT IndexParam : public __ArgvPackImpls {
private:
QString _place_holder;
public:
explicit IndexParam(const QString & place_v, const QString &means);
virtual ~IndexParam() = default;
// 通过 __ArgvPackImpls 继承
virtual QString placeHolder() const override;
int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
class ARGSPARSER_EXPORT MatchMode {
private:
QList<shared_ptr<IArgvPack>> args_mode;
int code_store;
public:
explicit MatchMode(const QList<shared_ptr<IArgvPack>> mode, int mode_code);
/**
* @brief 获取模式代码
* @return 模式代码
*/
int modeCode()const;
/**
* @brief 获取模式匹配结果
* @return 模式匹配结果
*/
QList<shared_ptr<IArgvPack>> result() const;
/**
* @brief 解析匹配参数
*/
bool parse(const QList<QString>& args, int argv_index, int parse_index);
};
class ARGSPARSER_EXPORT ArgsParser {
private:
QList<std::shared_ptr<MatchMode>> match_modes;
public:
void loadMode(int mode_code, const QList<std::shared_ptr<IArgvPack>> &args_model);
std::tuple<int, QList<std::shared_ptr<IArgvPack>>> parse(int argc, char* argv[]);
};
}