Command Line Argument Parser

#import "std/arg_parser"

Generic command line argument parsing tool.

Example

#import "std/arg_parser"

// Command line arguments context.
Args :: struct #base ArgParser.Ctx {
    my_flag: bool;
    my_name: string;
}

g_args: Args;

main :: fn () s32 {
    parser :: ArgParser.new();
    defer ArgParser.delete(parser);

    // Add new argument.
    ArgParser.add(
        parser, 
        "-f", // Short name (must start with -)
        "--flag", // Long name (must start with -)
        "Specify my flag.", // Help text.
        &fn (parser: ArgParser.Parser, args: []string, ctx: *ArgParser.Ctx) (s32, Error) {
            a: *Args = auto ctx;
            a.my_flag = true;
            return 1, ok(); // Return number of parsed arguments and state.
        });

    ArgParser.add(
        parser,
        "-n",
        "--name",
        "Specify my name.",
        &fn (parser: ArgParser.Parser, args: []string, ctx: *ArgParser.Ctx) (s32, Error) {
            a: *Args = auto ctx;
            if (args.len < 2) {
                return 0, error("Expected name!");
            }
            a.my_name = args[1];
            return 2, ok();
        });

    // Start parsing.
    state :: ArgParser.run(parser, command_line_arguments, &g_args, 1);
    if !is_ok(state) {
        print_err("%", state);
        ArgParser.print_help(parser);
        return 1;
    }

    print("%\n", g_args);
    return 0;
}