Hacker News new | ask | show | jobs
by userbinator 4154 days ago
That was interesting to read and certainly a different approach to solving a problem, but the biggest question I had in my mind while reading the article was "is it really necessary to create all this complexity --- and how does it compare to the traditional getopt()?"

I've used getopt() many times, even implemented its functionality for fun, and parsing commandline arguments has never been something I thought was particularly difficult or complex.

3 comments

I would think the biggest benefit is the fuller understanding of what you built. Probably some efficiency benefits.

Of course, this is also the biggest fault, I would think. You rarely have the luxury of understanding to this level all of the parts of your program. And something like command line parsing probably is not the bottleneck in any way of your program.

docopt() does few things and does them well:

* parse the call arguments and split them into options and arguments

* perform a very basic validation, i.e. handle the options which take a value and those who don't

Granted, mow.cli is much more complex. But it also does much more:

* Generate contextual help message

* Enforce arbitrarily complex validation rules (see the cp example) in your stead, meaning less code (and bugs) for you to write

* Does the routing, i.e. you don't need to have multi-level switch/case and if/else blocks to select and execute the correct code path based on the input arguments.

I talked about this in a previous article [1].

And finally, the library user doesn't have to deal with all this complexity: this is an implementation detail which I thought would interest technical readers, hence blogging about it.

You as a user only use the much easier to grasp exposed API [2]

[1] https://jawher.me/2015/01/13/parsing-command-line-arguments-...

[2] http://godoc.org/github.com/jawher/mow.cli

You could use this technique to examine the man page for a program and infer from that what valid command line arguments would be: some terminal shells (fish, for one, possibly zsh as well?) do something like this already to support autocomplete.