torque 645ef24a4a
command: preserve subcommand definition order
This was as simple as switching to an order preserving hashmap. This
lets the user decide which order their subcommands should be presented
in.
2023-11-08 22:56:11 -08:00
2022-11-20 12:54:42 -08:00
2022-11-20 12:54:42 -08:00
2023-08-04 00:08:12 -07:00

== 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 Zig `0.11.x`.

=== 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 end of flag 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
Zig library for declaratively creating command-line interfaces
Readme 336 KiB
Languages
Zig 100%