This is an interesting change. While I think generally passing in constant userdata is not terribly useful, the previous implementation precluded it entirely. Interface types, for example, are often passed directly and stored as constants (they hold pointers to their mutable state). Since we type erase this so it can be bound to the generic interface object, non-pointer objects must be passed by reference to avoid binding the parser interface to a temporary stack copy of the object. This means we have to handle these cases slightly differently. Also, while technically being classified as pointers, slices don't really behave like pointers, which is understandable but annoying. There's a bit of asymmetry here, as CommandBuilder(*u32) and CommandBuilder (u32) both require an *u32 when binding the parser interface. This is of course because pointers do not need to be rewrapped to be type erased. The same code path could be used for both cases, but then the user would have to pass in a pointer to a pointer, which actually looks a bit silly because then it potentially means having to do &&my_var.
== nearly obvious command line interface parser A zig library for composing declarative command-line interfaces. Heavily inspired by https://click.palletsprojects.com/[click] for Python. == Extemporaneous Bloviation [quote, George "Albert Einstein" Washington] ____ The alarm rings, and expletives spill from my mouth—instinctively, before any neuron has a chance to fire. You'd think this would get easier, having done it at least 12000 times, but I guess it just goes to show that practice does not necessarily converge on perfection, no matter what infinite limit t approaches. Eyes clamped shut against the encroaching underglow spilling from the curtains, I stretch my arms straight out from my sides and proceed to lose my balance, flying horizontally off of the mattress. An attempt at attitude control fails vigorously and I begin cartwheeling through open space, asserting a lopsided trajectory that intersects with the roof of the house. Passing through it unencumbered, I careen skyward and watch the ground recede into the distance, as the features of the landscape shrink and pop out of existence. ____ == Hello Requires a pre-release version of Zig `0.11.0`. `0.11.0-dev.1844+75ff34db9` is the oldest version specifically known to me to work. === Features WARNING: NOCLIP is usable but not currently mature or well-tested. Unfinished features and bugs likely exist. * highly configurable short/long option and argument specification ** named options can be associated with an environment variable ** named flags, which take no value and can be biased `true` or `false` ** multiple specification options, which can be provided many times to the CLI ** overridable built-in conversion functions for standard types ** required options that must be specified by the user ** default values for options * arbitrarily nestable subcommands for building sophisticated tools * parser that supports many conventional CLI behaviors ** congealed short flags (e.g. `-abc` is the same as `-a -b -c`) ** `--` to force early of argument parsing ** both `--long value` and `--long=value` styles are supported * option values are converted into rich native types using conversion callback functions ** integers ** basic tuple values ** strings ** enumerations as named choice sets ** more to come * automatic help text generation and formatting * CLI specification and parser are built at compile time === Use `zig build demo` for a demo. Otherwise just copy the file or use a submodule or something. ---- Usage: noclip-demo [options...] <arg> <subcommand ...> The definitive noclip demonstration utility This command demonstrates the functionality of the noclip library. cool! Arguments: arg This is an argument that doesn't really do anything, but it's very important. Options: -t, --test <int> <int> multi-value test option (env: NOCLIP_TEST) -c, --choice <choice> enum choice option (env: NOCLIP_CHOICE) (default: demo.Choice.second) -d, --default <uint> default value integer option (env: NOCLIP_DEFAULT) (default: 100) -m, --multi <u8> multiple specification test option -f, --flag / -F, --no-flag boolean flag (env: NOCLIP_FLAG) -M multiple specification test flag Environment variables: NOCLIP_ENVIRON environment variable only option Subcommands: verb Perform some sort of work ---- == LICENSE INTERNET SOFTWARE CONSORTIUM LICENSE
Description
Languages
Zig
100%