/simargs

A simple, opinionated, struct-based argument parser in Zig.

Primary LanguageZigMIT LicenseMIT

SimArgs

https://github.com/jiacai2050/simargs/actions/workflows/CI.yml/badge.svg

A simple, opinionated, struct-based argument parser in Zig, taking full advantage of comptime.

Blog post explaining how simargs is implemented:

Features

  • Supported data type:
  • Optional fields and fields with default value mean they are optional arguments
  • Use comptime as possible as I can
  • Provide print_help() out of the box

Usage

See demo.zig

# Run demo
zig build && ./zig-out/bin/demo -o /tmp/a.out --user-agent Firefox hello world 2>&1
------------------------------Program------------------------------
./zig-out/bin/demo

------------------------------Arguments------------------------------
   verbose: null
user-agent: demo.main__struct_1543.main__struct_1543__enum_1632.Firefox
   timeout: 30
    output: /tmp/a.out

------------------------------Positionals------------------------------
1: hello
2: world

------------------------------print_help------------------------------
 USAGE:
     ./zig-out/bin/demo [OPTIONS] [--] [file]

 OPTIONS:
	-v, --verbose                     Make the operation more talkative
	-A, --user-agent STRING            (valid: Chrome|Firefox|Safari)(default: Firefox)
	    --timeout INTEGER             Max time this request can cost(default: 30)
	-o, --output STRING               Write to file instead of stdout(required)

Install

Add simargs to your projects via submodule, and in build.zig add

exe.addPackagePath("simargs", "libs/simargs/src/simargs.zig");

Then import like this in your Zig code:

const simargs = @import("simargs");

Who’s Using

If you’d like to be added to this list, welcome to open a PR.

Acknowledgment

When implement simargs, I refer following projects to learn how to write idiomatic Zig code. Big Thanks!