forked from OctaForge/libostd
212 lines
5.6 KiB
C++
212 lines
5.6 KiB
C++
/** @example argparse.cc
|
|
*
|
|
* An example of using the command line argument parser.
|
|
*/
|
|
|
|
#include <ostd/argparse.hh>
|
|
#include <ostd/io.hh>
|
|
|
|
using namespace ostd;
|
|
|
|
int main() {
|
|
writeln("-- VERY SIMPLE EXAMPLE --\n");
|
|
{
|
|
arg_parser p{"test"};
|
|
|
|
p.add_optional("-h", "--help", 0)
|
|
.help("print this message and exit")
|
|
.action(arg_print_help(p));
|
|
|
|
p.add_optional("-t", "--test", 0)
|
|
.help("test help")
|
|
.action([](auto) { writeln("test invoked"); });
|
|
|
|
p.add_optional("-f", "--foo", 1)
|
|
.help("foo help")
|
|
.action([](auto vals) { writeln("foo invoked: ", vals[0]); });
|
|
|
|
writeln("--- without help:");
|
|
p.parse(iter({ "-f", "150", "-t" }));
|
|
|
|
writeln("\n--- with help:");
|
|
p.parse(iter({ "--help" }));
|
|
}
|
|
|
|
writeln("\n-- DIFFERENT SYNTAX --\n");
|
|
{
|
|
arg_parser p{"test", "/+"};
|
|
|
|
p.add_optional("/h", "/help", 0)
|
|
.help("print this message and exit")
|
|
.action(arg_print_help(p));
|
|
|
|
p.add_optional("+t", "++test", 0)
|
|
.help("test help")
|
|
.action([](auto) { writeln("test invoked"); });
|
|
|
|
p.add_optional("/f", "++foo", 1)
|
|
.help("foo help")
|
|
.action([](auto vals) { writeln("foo invoked: ", vals[0]); });
|
|
|
|
writeln("--- without help:");
|
|
p.parse(iter({ "/f", "150", "+t" }));
|
|
|
|
writeln("\n--- with help:");
|
|
p.parse(iter({ "/help" }));
|
|
}
|
|
|
|
writeln("\n-- GROUPS AND OTHER FEATURES --\n");
|
|
{
|
|
arg_parser p{"test"};
|
|
|
|
p.add_optional("-h", "--help", 0)
|
|
.help("print this message and exit")
|
|
.action(arg_print_help(p));
|
|
|
|
p.add_positional("foo", 1)
|
|
.help("a positional arg");
|
|
p.add_positional("bar", arg_value::REST)
|
|
.help("all other arguments");
|
|
|
|
auto &g1 = p.add_group("foo", "Group 1");
|
|
|
|
g1.add_optional("-x", "--test1", 0)
|
|
.help("test1 help");
|
|
g1.add_optional("-y", "--test2", 1)
|
|
.help("test2 help");
|
|
g1.add_optional("-z", "--test3", arg_value::OPTIONAL)
|
|
.help("test3 help");
|
|
|
|
auto &g2 = p.add_group("bar", "Group 2");
|
|
|
|
g2.add_optional("-a", "--test4", arg_value::ALL, 0)
|
|
.help("test4 help");
|
|
g2.add_optional("-b", "--test5", arg_value::ALL, 1)
|
|
.help("test5 help");
|
|
g2.add_optional("-c", "--test6", arg_value::ALL, 2)
|
|
.help("test6 help");
|
|
|
|
p.parse(iter({ "--help" }));
|
|
}
|
|
|
|
writeln("\n-- MUTUAL EXCLUSION --\n");
|
|
{
|
|
arg_parser p{"test"};
|
|
|
|
p.add_optional("-h", "--help", 0)
|
|
.help("print this message and exit")
|
|
.action(arg_print_help(p));
|
|
|
|
auto &mg = p.add_mutually_exclusive_group();
|
|
mg.add_optional("--foo", 0);
|
|
mg.add_optional("--bar", 0);
|
|
|
|
auto &mgr = p.add_mutually_exclusive_group(true);
|
|
mgr.add_optional("--test1", 0);
|
|
mgr.add_optional("--test2", 0);
|
|
|
|
writeln("--- help:");
|
|
p.parse(iter({ "--help" }));
|
|
|
|
writeln("\n--- only foo:");
|
|
try {
|
|
p.parse(iter({ "--foo" }));
|
|
} catch (arg_error const &e) {
|
|
writeln("---- error: ", e.what());
|
|
}
|
|
|
|
writeln("\n--- only required:");
|
|
p.parse(iter({ "--test1" }));
|
|
writeln("---- (no error)");
|
|
|
|
writeln("\n--- mutually exclusive:");
|
|
try {
|
|
p.parse(iter({ "--test1", "--foo", "--bar" }));
|
|
} catch (arg_error const &e) {
|
|
writeln("---- error: ", e.what());
|
|
}
|
|
|
|
writeln("\n--- both sets:");
|
|
p.parse(iter({ "--test1", "--foo" }));
|
|
writeln("---- (no error)");
|
|
}
|
|
}
|
|
|
|
/* output:
|
|
-- VERY SIMPLE EXAMPLE --
|
|
|
|
--- without help:
|
|
foo invoked: 150
|
|
test invoked
|
|
|
|
--- with help:
|
|
Usage: test [opts] [args]
|
|
|
|
Optional arguments:
|
|
-h, --help print this message and exit
|
|
-t, --test test help
|
|
-f FOO, --foo FOO foo help
|
|
|
|
-- DIFFERENT SYNTAX --
|
|
|
|
--- without help:
|
|
foo invoked: 150
|
|
test invoked
|
|
|
|
--- with help:
|
|
Usage: test [opts] [args]
|
|
|
|
Optional arguments:
|
|
/h, /help print this message and exit
|
|
+t, ++test test help
|
|
/f FOO, ++foo FOO foo help
|
|
|
|
-- GROUPS AND OTHER FEATURES --
|
|
|
|
Usage: test [opts] [args]
|
|
|
|
Positional arguments:
|
|
foo a positional arg
|
|
bar all other arguments
|
|
|
|
Optional arguments:
|
|
-h, --help print this message and exit
|
|
|
|
Group 1:
|
|
-x, --test1 test1 help
|
|
-y TEST2, --test2 TEST2 test2 help
|
|
-z [TEST3], --test3 [TEST3] test3 help
|
|
|
|
Group 2:
|
|
-x, --test1 test1 help
|
|
-y TEST2, --test2 TEST2 test2 help
|
|
-z [TEST3], --test3 [TEST3] test3 help
|
|
-a [TEST4 ...], --test4 [TEST4 ...] test4 help
|
|
-b TEST5 [TEST5 ...], --test5 TEST5 [TEST5 ...] test5 help
|
|
-c TEST6 TEST6 [TEST6 ...], --test6 TEST6 TEST6 [TEST6 ...] test6 help
|
|
|
|
-- MUTUAL EXCLUSION --
|
|
|
|
--- help:
|
|
Usage: test [opts] [args]
|
|
|
|
Optional arguments:
|
|
-h, --help print this message and exit
|
|
--foo
|
|
--bar
|
|
--test1
|
|
--test2
|
|
|
|
--- only foo:
|
|
---- error: one of the arguments '--test1', '--test2' is required
|
|
|
|
--- only required:
|
|
---- (no error)
|
|
|
|
--- mutually exclusive:
|
|
---- error: argument '--bar' not allowed with argument '--foo'
|
|
|
|
--- both sets:
|
|
---- (no error)
|
|
*/
|