diff --git a/std/argparse.nas b/std/argparse.nas index 6b9febe..a183329 100644 --- a/std/argparse.nas +++ b/std/argparse.nas @@ -1,3 +1,7 @@ +# argparse.nas +# 2023/12/7 by ValKmjolnir + +use std.padding; var new = func(description) { var _arg = globals.arg; @@ -5,8 +9,8 @@ var new = func(description) { description: description, subparser: [], command_list: [], - add_command: func(long, short, help) { - return _add_command(parser, long, short, help); + add_command: func(long, short, help, need_arg = false, need_nargs = false) { + return _add_command(parser, long, short, help, need_arg, need_nargs); }, add_subparser: func(name, help) { return _add_subparser(parser, name, help); @@ -26,8 +30,8 @@ var _new_sub_parser = func(description) { description: description, subparser: [], command_list: [], - add_command: func(long, short, help) { - return _add_command(parser, long, short, help); + add_command: func(long, short, help, need_arg = false, need_nargs = false) { + return _add_command(parser, long, short, help, need_arg, need_nargs); }, add_subparser: func(name, help) { return _add_subparser(parser, name, help); @@ -41,34 +45,67 @@ var _help = func(parser) { println(parser.description, "\n"); if (size(parser.subparser)>0) { println("Subcommand:"); + var max_pad_length = 0; + var info_pairs = []; foreach(var cmd; parser.subparser) { - println(" ", cmd.name, "\t", cmd.parser.description); + var info = " "~cmd.name; + append(info_pairs, {info: info, help: cmd.parser.description}); + info_length = size(info); + max_pad_length = max_pad_length>info_length? max_pad_length:info_length; + } + foreach(var pair; info_pairs) { + println(padding.rightpad(pair.info, max_pad_length), " ", pair.help); } println(); } if (size(parser.command_list)>0) { println("Options:"); + var max_pad_length = 0; + var info_pairs = []; foreach(var cmd; parser.command_list) { - println(" ", cmd.full_name, " ", cmd.short_name, "\t", cmd.help); + if (cmd.need_nargs) { + var info = " "~cmd.full_name~" [args...] "~cmd.short_name~" [args...]"; + append(info_pairs, {info: info, help: cmd.help}); + } elsif (cmd.need_arg) { + var info = " "~cmd.full_name~" arg "~cmd.short_name~" arg"; + append(info_pairs, {info: info, help: cmd.help}); + } else { + var info = " "~cmd.full_name~" "~cmd.short_name; + append(info_pairs, {info: info, help: cmd.help}); + } + var info_length = size(info); + max_pad_length = max_pad_length>info_length? max_pad_length:info_length; + } + foreach(var pair; info_pairs) { + println(padding.rightpad(pair.info, max_pad_length), " ", pair.help); } } } +var _in_list = func(arginfo, command_list) { + foreach(var cmd; command_list) { + if (arginfo==cmd.full_name or arginfo==cmd.short_name) { + return true; + } + } + return false; +} + var _parse = func(parser, args, result_hash) { if (size(args)==0) { println("Require more command, use \"--help\" to get help.\n"); _help(parser); exit(0); } - var first_arg = args[0]; foreach(var subparser; parser.subparser) { - if (subparser.name==first_arg) { + if (subparser.name==args[0]) { result_hash[subparser.name] = true; _parse(subparser.parser, size(args)>1? args[1:]:[], result_hash); return; } } - foreach(var this_arg; args) { + for(var i = 0; i