Compare commits

..

No commits in common. "085236fb6221d221ba5037dd54e90b3fbd391ff7" and "f8f5b4eafc2c83880a89b62b6ef6a25ae7e59f4a" have entirely different histories.

5 changed files with 70 additions and 71 deletions

View File

@ -7,14 +7,12 @@ namespace Arguments
enum ERROR {
NO_ERROR = 0,
ERROR_UNKNOWN_ARGUMENT,
ERROR_UNKNOWN_POSITIONAL_ARGUMENT,
ERROR_MISSING_VALUE,
ERROR_MISSING_POSITIONAL_ARGUMENT,
ERROR_INVALID_INT,
SPECIAL_CASE_HELP,
};
class Parser
@ -40,6 +38,8 @@ public:
Argument(const char* name);
Argument(char name);
Argument& description(const char* desc);
Argument& alias(const char* alias);
Argument& alias(char alias);
@ -56,6 +56,8 @@ protected:
const char* m_Name;
char m_ShortName;
const char* m_Description;
private:
std::vector<const char*> m_Aliases;
std::vector<char> m_ShortAliases;
@ -110,11 +112,16 @@ class PositionalArgument
public:
PositionalArgument(bool required);
void description(const char* desc);
virtual ERROR parseValue(Parser& state) = 0;
public:
bool found;
bool required;
private:
const char* m_Description;
};

View File

@ -6,9 +6,8 @@ SOURCE_DIR = Src
HEADER_DIR = Inc
BUILD_DIR = bin
INSTALL_PREFIX ?= /usr/local
HEADER_INSTALL_DIR = $(INSTALL_PREFIX)/include
INSTALL_DIR = $(INSTALL_PREFIX)/lib
HEADER_INSTALL_DIR = /usr/local/include
INSTALL_DIR = /usr/local/lib
LIB_NAME = argParser
ifeq ($(TYPE), $(SHARED_TYPE))

View File

@ -1,19 +0,0 @@
# v2
I never really liked the interface of v1, so after coming back to this project, I spent some time thinking about how it could be improved,
took some inspiration from Golangs flag module, and made v2, which has a simpler, more flexible interface with better type safety
For example:
- It doesn't cast char* to uint64_t and require you to cast it back
- It doesn't require you to create a parser object, you just call parse
- You don't have to add the arguments to that parser object, it's taken care of just by calling the constructor
- You aren't required to provide descriptions for you program and every argument
That last one means that v2 will _not_ take care of --help and -h for you. If you want a help menu, you have to create it yourself.
But help menus aren't always required and when you do want one, this gives you control over what it looks like
# How do I use this
Check out [test.cpp](test.cpp). It demonstrates the full scope of this library

View File

@ -51,6 +51,12 @@ Argument::Argument(char name)
arguments.push_back(this);
};
Argument& Argument::description(const char* desc)
{
m_Description = desc;
return *this;
}
Argument& Argument::alias(const char* alias)
{
m_Aliases.push_back(alias);
@ -217,7 +223,7 @@ ERROR Bool::parseValue(Parser& state)
PositionalArgument::PositionalArgument(bool required)
: found(false), required(required)
: found(false), required(required), m_Description(nullptr)
{
if (required) {
for (PositionalArgument* arg: positionalArguments) {
@ -231,6 +237,12 @@ PositionalArgument::PositionalArgument(bool required)
positionalArguments.push_back(this);
}
void PositionalArgument::description(const char* desc)
{
m_Description = desc;
}
PositionalInt::PositionalInt(int64_t defaultValue, bool required)
: PositionalArgument(required), value(defaultValue) { }

View File

@ -5,13 +5,13 @@
int main(int argc, char** argv) {
Arguments::String first('f', "none");
first.alias("first");
first.description("First arg");
Arguments::Int second("second", 0);
second.alias('s');
second.description("Second arg").alias('s');
Arguments::Bool third("third");
third.alias("abc").alias('t');
third.description("Third arg").alias("abc").alias('t');
Arguments::PositionalString name("", true);
Arguments::PositionalInt age(0, false);