WsParser_VS/ArgsParser/argsparser.h

124 lines
2.7 KiB
C
Raw Normal View History

2024-06-22 10:53:51 +00:00
#pragma once
#include <memory>
#include <QString>
#include <QList>
#include <qHash>
#include <tuple>
#include "argsparser_global.h"
namespace args_parse {
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
enum class ParamType {
IndexParam,
FloatParam,
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
class ArgvPack {
public:
virtual ~ArgvPack() = default;
virtual ParamType paramType() const = 0;
virtual QString means() const = 0;
virtual QString value() const = 0;
/**
* @brief ƥ<EFBFBD><EFBFBD><EFBFBD>.
*
* \return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual int matchLenth() const = 0;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* \param argv <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \param start <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \return ƥ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
*/
virtual bool parse(const QList<QString> args, int start) = 0;
};
class ARGSPARSER_EXPORT ArgvPackImpl : public ArgvPack {
private:
QString means_store;
QString value_store;
ParamType type_store;
public:
ArgvPackImpl(const QString &means, ParamType t);
void setValue(const QString &v);
// ͨ<><CDA8> ArgvPack <20>̳<EFBFBD>
ParamType paramType() const override;
QString means() const override;
QString value() const override;
};
class ARGSPARSER_EXPORT FloatArgvImpl : public ArgvPackImpl {
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key-value<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>ģʽ.
* --key value
*/
class ARGSPARSER_EXPORT FloatArgvPack : public FloatArgvImpl {
public:
explicit FloatArgvPack(const QString& key, const QString &means, bool optional = false);
virtual ~FloatArgvPack() = default;
virtual int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>ģʽ.
* --key
*/
class ARGSPARSER_EXPORT FloatOption : public FloatArgvImpl {
public:
explicit FloatOption(const QString& key, const QString& means, bool optional = false);
virtual ~FloatOption() = default;
virtual int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
class ARGSPARSER_EXPORT IndexParam : public ArgvPackImpl {
public:
explicit IndexParam(const QString &means);
virtual ~IndexParam() = default;
// ͨ<><CDA8> ArgvPackImpl <20>̳<EFBFBD>
int matchLenth() const override;
bool parse(const QList<QString> args, int start) override;
};
class MatchMode;
class ARGSPARSER_EXPORT ArgsParser {
private:
QList<std::shared_ptr<MatchMode>> match_modes;
public:
void loadMode(int mode_code, const QList<std::shared_ptr<ArgvPack>> &args_model);
std::tuple<int, QList<std::shared_ptr<ArgvPack>>> parse(int argc, char* argv[]);
};
}