Command Line Argument Parsing

Compile using blc my-file-name.bl and run ./out.

#import "extra/argparse"

MyOptLevel :: enum {
	DEBUG;
	RELEASE_SMALL;
	RELEASE_FAST;
}

// Some options we need.
MyArgs :: struct {
	is_debug: bool;
	worker_count: s32;
	directory: string_view;
	inputs: []string_view;
	outputs: []string_view;
	optimization: MyOptLevel;
}

main :: fn () s32 {
	using argparse;

	// Create and initialize new instance of argument parser.
	parser: Parser;
	init(&parser, "This is cool testing application parsing command-line arguments, enjoy!");
	// Don't forget to terminate it!
	defer terminate(&parser);

	args: MyArgs;

	// Set the executable name (used in help).
	set_executable_name(&parser, command_line_arguments[0]);

	// Add very basic usage information.
	add_usage(&parser, "[options]");

	// Register positional argument prefixes for input and output files.
	add_positional(&parser, &args.inputs, "--input", "-i", "List of input files.");
	add_positional(&parser, &args.outputs, "--output", "-o", "List of output files.");

	// Register all other arguments.
	add(&parser, &args.is_debug, "--debug", "-d", "Enable debug mode"); // Boolean flag.
	add(&parser, &args.worker_count, "--worker-count", "", "Count of worker threads."); // Integer value.
	add(&parser, &args.directory, "--dir", "", "Root directory path."); // String view (no need to be preallocated).
	add(&parser, &args.optimization, "--opt", "", "Optimization level."); // Enumerator value.

	// Parse all command line arguments here.
	parsed_argument_count, parse_error :: parse(&parser, command_line_arguments);
	if parse_error {
		// Print error and show the help.
		print_err(parse_error);
		print_help(&parser);
		return 1;
	}

	// Use the parsed options.
	print("\nParsed arguments: %\n", parsed_argument_count);
	print("%\n", args);
	return 0;
}