Git Product home page Git Product logo

args's Introduction

Args

Simple and typesafe commandline parsing for C++14.

Quickstart

Simply provide a class with fields that is to be filled by command-line arguments:

struct hello
{
    static const char* help()
    {
        return "Simple program that greets NAME for a total of COUNT times.";
    }
    int count;
    std::string name;

    hello() : count(1)
    {}

    template<class F>
    void parse(F f)
    {
        f(count, "--count", "-C", args::help("Number of greetings."));
        f(name, "--name", "-N", args::help("The person to greet."), args::required());
    }

    void run()
    {
        for(int i=0;i<count;i++) printf("%s\n", name.c_str());
    }
};

int main(int argc, char const *argv[]) 
{
    args::parse<hello>(argc, argv);
}

The command then could be run like this:

$ hello --name Paul --count 3
Paul
Paul
Paul

The args library will auto-generate help info:

$ hello --help
Usage: hello [options...]

  Simple program that greets NAME for a total of COUNT times.  

Options: 

            -h, --help Show help  
 --count, -C [integer] Number of greetings.  
   --name, -N [string] The person to greet.

In addition, nested commands can be created:

struct cli : args::group<cli>
{
    static const char* help()
    {
        return "Command-line interface to manage a database";
    }
};

struct initdb : cli::command<initdb>
{
    initdb() {}
    static const char* help()
    {
        return "Initialize database";
    }
    void run()
    {
        printf("Initialize database\n");
    }
};

struct dropdb : cli::command<dropdb>
{
    dropdb() {}
    static const char* help()
    {
        return "Delete database";
    }
    void run()
    {
        printf("Delete database\n");
    }
};

int main(int argc, char const *argv[]) 
{
    args::parse<cli>(argc, argv);
}

So each subcommand can be ran like this:

$ cli initdb
Initialize database
$ cli dropdb
Delete database

In addition help is generated for subcommands as well:

$ cli --help
Usage: cli [options...] [command]

  Command-line interface to manage a database  

Options: 

 -h, --help Show help  

Commands: 

     dropdb Delete database  
     initdb Initialize database  

args's People

Contributors

dmry avatar pavelosipov avatar pfultz2 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

args's Issues

Can`t parse "--help" argument

When I was trying to test the first use case under the Quickstart, all the argument parser works great except the "--help".

$ ./TestArg.exe --name=marvin
marvin

$ ./TestArg.exe --help
Segmentation fault

Could help to check this?

Example code doesn't compile with VS2017

I just tried the basic example in a fresh C++ project in VS2017 on Windows and received the following:

1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2065: 'not': undeclared identifier
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2059: syntax error: ''
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2143: syntax error: missing ';' before '{'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2143: syntax error: missing ')' before ';'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2143: syntax error: missing '>' before ';'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2976: 'std::enable_if': too few template arguments
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\xtr1common(52): note: see declaration of 'std::enable_if'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2993: 'std::enable_if': illegal type for non-type template parameter '__formal'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2988: unrecognizable template declaration/definition
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2059: syntax error: ''
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2065: 'T': undeclared identifier
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2923: 'std::is_convertible': 'T' is not a valid template type argument for parameter '_From'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2143: syntax error: missing ';' before 'std::is_convertible'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2059: syntax error: ')'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(225): error C2039: 'type': is not a member of 'global namespace'' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(227): error C2143: syntax error: missing ';' before '{' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(227): error C2447: '{': missing function header (old-style formal list?) 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2146: syntax error: missing ')' before identifier 'and' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2143: syntax error: missing ';' before '{' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2143: syntax error: missing ')' before ';' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2143: syntax error: missing '>' before ';' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2976: 'std::enable_if': too few template arguments 1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\xtr1common(52): note: see declaration of 'std::enable_if' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2993: 'std::enable_if': illegal type for non-type template parameter '__formal' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2988: unrecognizable template declaration/definition 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2059: syntax error: '<end Parse>' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2447: '{': missing function header (old-style formal list?) 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2059: syntax error: ')' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2059: syntax error: ',' 1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(231): error C2039: 'type': is not a member of 'global namespace''
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(233): error C2143: syntax error: missing ';' before '{'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(233): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(268): error C2146: syntax error: missing ')' before identifier 'and'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(268): error C2993: 'std::string': illegal type for non-type template parameter '_Test'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(306): error C2955: 'args::argument_type': use of class template requires template argument list
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(243): note: see declaration of 'args::argument_type'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(306): error C2027: use of undefined type 'args::argument_type'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(243): note: see declaration of 'args::argument_type'
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(306): error C2065: 'none': undeclared identifier
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(315): error C2065: 'not': undeclared identifier
1>c:\users\brody\documents\visual studio 2017\projects\templatetests\templatetests\args.hpp(315): error C2146: syntax error: missing ';' before identifier 'eager_callbacks'

It's a shame because this looks nice and simple!

License missing

This repository does not appear to have a license notice. For most people this means that they cannot use it.

Add a license

I've recently evaluated CLI libraries to use in a project, and came across args. However, it cannot be used at all since the project is not licensed. Can you add one?

Can't parse in arguments with a space in it

When I try helloworld.exe -N "Nobody, or am I?" -C 4 it should see the following arguments because of how command line works:

  • -N
  • "Nobody, or am I?"
  • -C
  • 4

but it actually only sees this:

  • -N
  • Nobody,
  • -C
  • 4

Can you fix this please? I'm using an almost entirely exact copy of the example except for the -h argument which doesn't work.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.