saving
This commit is contained in:
parent
4cdd132d8d
commit
65e4801dad
|
|
@ -0,0 +1,101 @@
|
||||||
|
# zargs
|
||||||
|
|
||||||
|
A compile-time argument parser for Zig, hybrid mode, you can define structs whenever/wherever.
|
||||||
|
|
||||||
|
And get nice help info, but you also get the ability to arbitrarily parse structs at run time.
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
!here are two main ways people like to parse arguments, and they both suck in different ways.
|
||||||
|
|
||||||
|
1. predefine argv structure and parse state in one step (like python argparse)
|
||||||
|
2. game engine style for each place in the code that needs an argument loop over args and look for the argument you want
|
||||||
|
|
||||||
|
2 is very flexible, 1 is not.
|
||||||
|
|
||||||
|
this one lets you do it any way you wish or even redefine the argument parsing structure and
|
||||||
|
still generate a helpful text using help().
|
||||||
|
|
||||||
|
Ai generated README with examples below.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Define a config struct with default values and optional metadata:
|
||||||
|
|
||||||
|
```zig
|
||||||
|
const zargs = @import("zargs");
|
||||||
|
|
||||||
|
const Config = struct {
|
||||||
|
input: []const u8 = "input.txt",
|
||||||
|
output: []const u8 = "output.txt",
|
||||||
|
verbose: bool = false,
|
||||||
|
format: Format = .json,
|
||||||
|
max_size: u32 = 1024,
|
||||||
|
tags: []const []const u8 = &[_][]const u8{},
|
||||||
|
|
||||||
|
pub const Format = enum { json, xml, csv };
|
||||||
|
|
||||||
|
pub const meta = .{
|
||||||
|
.input = .{ .short = 'i', .help = "Input file path" },
|
||||||
|
.output = .{ .short = 'o', .help = "Output file path" },
|
||||||
|
.verbose = .{ .short = 'v', .help = "Enable verbose output" },
|
||||||
|
.format = .{ .help = "Output format" },
|
||||||
|
.max_size = .{ .help = "Maximum file size in KB" },
|
||||||
|
.tags = .{ .help = "Tags to filter (can specify multiple)" },
|
||||||
|
};
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Then parse it:
|
||||||
|
|
||||||
|
```zig
|
||||||
|
const config = try zargs.parse(Config, allocator);
|
||||||
|
defer zargs.shutdown();
|
||||||
|
|
||||||
|
if (zargs.isHelp(allocator)) {
|
||||||
|
const help = try zargs.getUsageAlloc(allocator, "my-program");
|
||||||
|
defer allocator.free(help);
|
||||||
|
std.debug.print("{s}", .{help});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This gives you:
|
||||||
|
|
||||||
|
```
|
||||||
|
my-program --input data.csv -v --format csv --max-size 2048 --tags prod,staging
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multi-Module Parsing
|
||||||
|
|
||||||
|
Multiple config structs can share the same argument list. Each call to `parse` pulls out the fields it recognizes:
|
||||||
|
|
||||||
|
```zig
|
||||||
|
const graphics = try zargs.parse(GraphicsConfig, allocator);
|
||||||
|
const audio = try zargs.parse(AudioConfig, allocator);
|
||||||
|
const engine = try zargs.parse(EngineConfig, allocator);
|
||||||
|
```
|
||||||
|
|
||||||
|
Help output combines all registered modules.
|
||||||
|
|
||||||
|
## Metadata Options
|
||||||
|
|
||||||
|
Each field in `pub const meta` supports:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|------------|------------|------------------------------------|
|
||||||
|
| `short` | `u8` | Single-character short flag |
|
||||||
|
| `help` | `[]const u8` | Description shown in help text |
|
||||||
|
| `name` | `[]const u8` | Override the generated flag name |
|
||||||
|
| `required` | `bool` | Mark the argument as required |
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Requires Zig 0.15.2 or later.
|
||||||
|
|
||||||
|
```
|
||||||
|
zig build test # run unit tests
|
||||||
|
zig build examples # build examples
|
||||||
|
zig build run-file-processor -- --help
|
||||||
|
zig build run-multi-module -- --help
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue