From df1e0af03db13339add48a9bc6350eedb30775ff Mon Sep 17 00:00:00 2001 From: Jack Jamison Date: Tue, 21 Jul 2026 11:18:21 -0400 Subject: argument parsing and subcommands --- snag/main.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'snag/main.c') diff --git a/snag/main.c b/snag/main.c index ff7ac64..c6abcb1 100644 --- a/snag/main.c +++ b/snag/main.c @@ -1,23 +1,43 @@ #include +#include "util.h" +#include "libargs/args.h" #include "pkg_db.h" -void subcmd_install(char* pkgs[], size_t count); +int cmd_install(char* cmd_name, ArgParser* parser); int main(int argc, char* argv[]) { - // run install subcommand with each argument as a package - subcmd_install(argv+1, argc-1); + // create argument parser + ArgParser* parser = ap_new_parser(); + if (parser == NULL) error_out("failed to initialize cli parsing"); + ap_set_helptext(parser, "Usage: snag "); + ap_set_version(parser, "0.0"); + + // add install subcommand + ArgParser* install = ap_new_cmd(parser, "install inst i"); + if (install == NULL) error_out("failed to initialize install cli subcommand"); + ap_set_helptext(install, "Usage: snag install [packages]"); + ap_set_cmd_callback(install, cmd_install); + + // parse the arguments (automatically executes subcommands) + if (!ap_parse(parser, argc, argv)) error_out("failed to parse arguments"); + + // if no subcommand was specified, parse and execute install as the root command + if (!ap_found_cmd(parser)) { + if (!ap_parse(install, argc, argv)) error_out("failed to parse arguments"); + cmd_install("install", install); + } + ap_free(parser); return 0; } -void subcmd_install(char* pkgs[], size_t count) { - - // install each package listed - for (int i = 0; i < count; ++i) { +int cmd_install(char* cmd_name, ArgParser* parser) { - char* pkgid = pkgs[i]; + // install each package specified + for (int i = 0; i < ap_count_args(parser); i++) { + char* pkgid = ap_get_arg_at_index(parser, i); // load package description package_info_t info; @@ -26,4 +46,6 @@ void subcmd_install(char* pkgs[], size_t count) { run_package_install(&info); } } + + return 0; } -- cgit v1.2.3