💾 Archived View for ser1.net › post › claptrap.gmi captured on 2023-01-29 at 02:38:36. Gemini links have been rewritten to link to archived content
View Raw
More Information
➡️ Next capture (2023-07-22)
-=-=-=-=-=-=-
claptrap opts lib: very small, much features, getoptish
https://sr.ht/~ser/claptrap/
Every few months, when I start a new CLI, I spend a good amount of time looking around for a flags library. For trivial programs, the stdlib `flag` library is OK, but it breaks `getopt` arguments style, the undisputed most popular arguments standard for POSIXy OSes, in the world. And there are a wealth of alternative flags libraries available, some quite good, but I am inevitably unsatisfied with them for usually one of three reasons:
- They're huge. Lots of code, lots of dependencies. This is especially a problem when you're trying to validate all of your dependencies for a sensitive program, like something that interacts with credentials.
- They have an API that feels more like a framework than a library. These are flags libraries you find yourself building your application around. Any flags library that forces you to restructure your program falls in this category.
- They're *too* bare-bones. Having to re-write input type validation code over and over gets tedious. This is where I shy away from most of the `getopts` clones. `getopts` is pretty bare bones, but conforming to the usage patterns doesn't force you to copy the skeletal feature set.
Over time, I'd built up some tooling to evaluate lib tools; I've posted that, and the analysis, here, and I focused this time on clapper, which seemed to fit the bill. There were a couple of small features I wanted, and I sent in a couple of patches, but after one particularly engaging hacking session I ended up with a drastic rewrite that maintained and expanded the feature set while preserving the small size and general `getopts` compatability. At this point, it was a different library, so I rebranded it and Claptrap was born.
here
clapper
Claptrap is a small but powerful Go package to parse command-line arguments
- getopt(3) style*. Designed to not burden your application down while providing a rich feature set and validation. for making CLI based libraries with ease. It has support for:
*getopt(3) style*
- getopt long & short flags (--bool, -b)
- combined short (-b -e == -be)
- inverted bools (--bool => --no-bool)
- typed params (int, bool, Duration, string, float)
- mandatory flags and arguments
- positional arguments
- global flags
- subcommands
- variadic flags (-a 1 -a 2 -a 3)
- partial command matching (--list == --ls == --st)
- Usage()
And it's 455 lines of code, and **0** dependencies.