finish parse in argparse.nas

This commit is contained in:
ValKmjolnir 2023-12-08 00:07:14 +08:00
parent 8e0d1e18e1
commit ca7666c220
2 changed files with 57 additions and 19 deletions

View File

@ -1,7 +1,6 @@
var _arg = globals.arg;
var new = func(description) { var new = func(description) {
var _arg = globals.arg;
var parser = { var parser = {
description: description, description: description,
subparser: [], subparser: [],
@ -13,28 +12,70 @@ var new = func(description) {
return _add_subparser(parser, name, help); return _add_subparser(parser, name, help);
}, },
parse: func() { parse: func() {
return _parse(parser); return _parse(parser, _arg);
} }
}; };
parser.add_command("--help", "-h", "Get help info and exit");
return parser;
}
var _new_sub_parser = func(description) {
var parser = {
description: description,
subparser: [],
command_list: [],
add_command: func(long, short, help) {
return _add_command(parser, long, short, help);
},
add_subparser: func(name, help) {
return _add_subparser(parser, name, help);
}
};
parser.add_command("--help", "-h", "Get help info and exit");
return parser; return parser;
} }
var _help = func(parser) { var _help = func(parser) {
println(parser.description); println(parser.description, "\n");
println("Subcommand:"); if (size(parser.subparser)>0) {
foreach(var cmd; parser.subparser) { println("Subcommand:");
println(cmd.name, "\t", cmd.parser.description); foreach(var cmd; parser.subparser) {
println(" ", cmd.name, "\t", cmd.parser.description);
}
println();
} }
println("Options:"); if (size(parser.command_list)>0) {
foreach(var cmd; parser.command_list) { println("Options:");
println(cmd.full_name, " ", cmd.short_name, "\t", cmd.help); foreach(var cmd; parser.command_list) {
println(" ", cmd.full_name, " ", cmd.short_name, "\t", cmd.help);
}
} }
} }
var _parse = func(parser) { var _parse = func(parser, args) {
if (size(_arg)==0) { if (size(args)==0) {
_help(parser); _help(parser);
return;
} }
var first_arg = args[0];
foreach(var subparser; parser.subparser) {
if (subparser.name==first_arg) {
return _parse(subparser.parser, size(args)>1? args[1:]:[]);
}
}
foreach(var cmd; parser.command_list) {
if (first_arg=="--help" or first_arg=="-h") {
_help(parser);
exit(0);
}
if (first_arg==cmd.full_name or first_arg==cmd.short_name) {
return "[WIP]";
}
}
# unreachable
println("Invalid command `", first_arg, "`\n");
_help(parser);
return;
} }
var _add_command = func(parser, long, short, help) { var _add_command = func(parser, long, short, help) {
@ -49,7 +90,8 @@ var _add_command = func(parser, long, short, help) {
var _add_subparser = func(parser, name, help) { var _add_subparser = func(parser, name, help) {
var new_subparser = { var new_subparser = {
name: name, name: name,
parser: new(help) parser: _new_sub_parser(help)
}; };
append(parser.subparser, new_subparser); append(parser.subparser, new_subparser);
return new_subparser.parser;
} }

View File

@ -1,11 +1,7 @@
# use module.libjson;
# libjson.stringify(math.tan);
# println(libjson.get_error());
use std.argparse; use std.argparse;
var args = argparse.new("test cli"); var args = argparse.new("test cli");
args.add_command("--what", "-w", "what-what"); args.add_command("--what", "-w", "what-what");
args.add_subparser("what", "what-what"); var subparser0 = args.add_subparser("subcommand0", "what-what");
subparser0.add_command("--sub-what", "-sw", "sub-what-what");
args.parse(); args.parse();