Thread overview
getopt helpWanted
Apr 29, 2015
novice2
Apr 29, 2015
Brian Schott
Apr 30, 2015
novice2
Apr 30, 2015
wobbles
April 29, 2015
Hello.

Help me please to understand, how to show usage help to user, who enter wrong options?
For example, user not provided required filename.
I want to show error message, and program usage help text.
But likely getopt don't provide help text until valid options will be parsed.

Reduced code:
///////////////
import std.stdio: writefln;
import std.getopt;

void main (string[] args)
{
  string fname;
  GetoptResult helpInfo;

  try
  {
    helpInfo = getopt(
      args,
      std.getopt.config.required, "file|f", "File name", &fname);

    writefln("Options parsed: fname=%s", fname);
  }
  catch(Exception e)
  {
    writefln("\nERROR: %s", e.msg);
    defaultGetoptPrinter("Program usage:", helpInfo.options);
  }
}
///////////////

Output:
ERROR: Required option file|fwas not supplied
Program usage:
April 29, 2015
What you're trying to do is currently impossible. I filed a bug (https://issues.dlang.org/show_bug.cgi?id=14525) because what you're trying to do really should be possible.

import std.stdio : writefln;
import std.getopt;

void main(string[] args)
{
    string fname;
    try
    {
        getopt(args, std.getopt.config.required, "file|f", "File name", &fname);
        writefln("Options parsed: fname=%s", fname);
    }
    catch (GetOptException e)
    {
        writefln("\nERROR: %s", e.msg);
        auto p = ["placeholder"];
        auto r = getopt(p, "file|f", "File name", &fname);
        defaultGetoptPrinter("Program usage:", r.options);
    }
}

April 30, 2015
Thank you, Brian!
April 30, 2015
On Wednesday, 29 April 2015 at 22:02:29 UTC, novice2 wrote:
> Hello.
>
> Help me please to understand, how to show usage help to user, who enter wrong options?
> For example, user not provided required filename.
> I want to show error message, and program usage help text.
> But likely getopt don't provide help text until valid options will be parsed.
>
> Reduced code:
> ///////////////
> import std.stdio: writefln;
> import std.getopt;
>
> void main (string[] args)
> {
>   string fname;
>   GetoptResult helpInfo;
>
>   try
>   {
>     helpInfo = getopt(
>       args,
>       std.getopt.config.required, "file|f", "File name", &fname);
>
>     writefln("Options parsed: fname=%s", fname);
>   }
>   catch(Exception e)
>   {
>     writefln("\nERROR: %s", e.msg);
>     defaultGetoptPrinter("Program usage:", helpInfo.options);
>   }
> }
> ///////////////
>
> Output:
> ERROR: Required option file|fwas not supplied
> Program usage:

Also, I suggest you look at docopt:
http://code.dlang.org/packages/docopt

It makes the whole parsing of CLI arguments very nice and easy.