2022-07-26 02:57:57 +00:00
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
2022-07-26 21:14:58 +00:00
|
|
|
#include <stdint.h>
|
2022-07-26 02:57:57 +00:00
|
|
|
|
|
|
|
namespace Arguments
|
|
|
|
{
|
|
|
|
|
2022-07-27 03:26:02 +00:00
|
|
|
enum ERROR {
|
2024-07-14 01:09:58 +00:00
|
|
|
NO_ERROR = 0,
|
2024-07-14 00:56:16 +00:00
|
|
|
|
2024-07-14 01:09:58 +00:00
|
|
|
ERROR_UNKNOWN_ARGUMENT,
|
|
|
|
ERROR_UNKNOWN_POSITIONAL_ARGUMENT,
|
2024-07-14 00:56:16 +00:00
|
|
|
|
2024-07-14 01:09:58 +00:00
|
|
|
ERROR_MISSING_VALUE,
|
|
|
|
ERROR_MISSING_POSITIONAL_ARGUMENT,
|
2024-07-14 00:56:16 +00:00
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
ERROR_INVALID_INT,
|
2022-07-27 03:26:02 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
class Parser
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Parser(int argc, char** argv);
|
|
|
|
|
|
|
|
bool hasNext();
|
|
|
|
void next();
|
|
|
|
const char* value();
|
|
|
|
|
|
|
|
private:
|
|
|
|
int m_ArgCount;
|
|
|
|
char** m_ArgValues;
|
|
|
|
|
|
|
|
int m_Index;
|
2022-07-26 02:57:57 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
|
|
|
|
class Argument
|
2022-07-26 02:57:57 +00:00
|
|
|
{
|
|
|
|
public:
|
2024-07-08 20:21:09 +00:00
|
|
|
Argument(const char* name);
|
|
|
|
Argument(char name);
|
|
|
|
|
|
|
|
Argument& alias(const char* alias);
|
|
|
|
Argument& alias(char alias);
|
|
|
|
|
|
|
|
bool matches(const char*);
|
|
|
|
bool matchesShort(char);
|
|
|
|
|
|
|
|
virtual ERROR noValue() = 0;
|
|
|
|
virtual ERROR parseValue(Parser& state) = 0;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool found;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
const char* m_Name;
|
|
|
|
char m_ShortName;
|
|
|
|
|
2022-07-26 02:57:57 +00:00
|
|
|
private:
|
2024-07-08 20:21:09 +00:00
|
|
|
std::vector<const char*> m_Aliases;
|
|
|
|
std::vector<char> m_ShortAliases;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Int: public Argument
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Int(const char* name, int64_t defaultValue);
|
|
|
|
Int(char name, int64_t defaultValue);
|
|
|
|
|
|
|
|
ERROR noValue() override;
|
|
|
|
ERROR parseValue(Parser& state) override;
|
2022-07-26 02:57:57 +00:00
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
public:
|
|
|
|
int64_t value;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void printMissingValueError();
|
2022-07-26 02:57:57 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
class String: public Argument
|
2022-07-26 02:57:57 +00:00
|
|
|
{
|
|
|
|
public:
|
2024-07-08 20:21:09 +00:00
|
|
|
String(const char* name, const char* defaultValue);
|
|
|
|
String(char name, const char* defaultValue);
|
|
|
|
|
|
|
|
ERROR noValue() override;
|
|
|
|
ERROR parseValue(Parser& state) override;
|
|
|
|
|
|
|
|
public:
|
|
|
|
const char* value;
|
|
|
|
|
2022-07-26 02:57:57 +00:00
|
|
|
private:
|
2024-07-08 20:21:09 +00:00
|
|
|
void printMissingValueError();
|
|
|
|
};
|
|
|
|
|
|
|
|
class Bool: public Argument
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Bool(const char* name);
|
|
|
|
Bool(char name);
|
2022-07-26 02:57:57 +00:00
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
ERROR noValue() override;
|
|
|
|
ERROR parseValue(Parser& state) override;
|
2022-07-26 02:57:57 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
|
|
|
|
class PositionalArgument
|
2022-07-26 02:57:57 +00:00
|
|
|
{
|
|
|
|
public:
|
2024-07-08 20:21:09 +00:00
|
|
|
PositionalArgument(bool required);
|
|
|
|
|
|
|
|
virtual ERROR parseValue(Parser& state) = 0;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool found;
|
|
|
|
bool required;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class PositionalInt: public PositionalArgument
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PositionalInt(int64_t defaultValue, bool required);
|
|
|
|
|
|
|
|
ERROR parseValue(Parser& state) override;
|
|
|
|
|
|
|
|
public:
|
|
|
|
int64_t value;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PositionalString: public PositionalArgument
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PositionalString(const char* defaultValue, bool required);
|
|
|
|
|
|
|
|
ERROR parseValue(Parser& state) override;
|
|
|
|
|
|
|
|
public:
|
|
|
|
const char* value;
|
2022-07-26 02:57:57 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 20:21:09 +00:00
|
|
|
|
|
|
|
ERROR parse(int argc, char** argv);
|
|
|
|
ERROR findMatch(Parser& parser, const char* name);
|
|
|
|
ERROR findShortMatch(Parser& parser, char name, bool last);
|
|
|
|
ERROR matchPositional(Parser& parser);
|
|
|
|
|
|
|
|
void printInvalidIntError(const char* value);
|
|
|
|
void printUnknownArgError(const char* argument);
|
|
|
|
void printUnknownArgError(char argument);
|
|
|
|
void printUnknownPosArgError(const char* value);
|
|
|
|
|
2022-07-26 02:57:57 +00:00
|
|
|
} // namespace Arguments
|
2024-07-08 20:21:09 +00:00
|
|
|
|