in src/CLIBase.hack [342:399]
public async function displayHelpAsync(
IO\WriteHandle $out,
): Awaitable<void> {
$usage = 'Usage: '.C\firstx($this->argv);
$opts = $this->getSupportedOptions();
if (C\is_empty($opts)) {
$usage .= ' [-h|--help]';
} else {
$usage .= ' [OPTIONS]';
}
if ($this is CLIWithRequiredArguments) {
$class =
TypeAssert\classname_of(CLIWithRequiredArguments::class, static::class);
$usage .= ' '.
\implode(' ', $class::getHelpTextForRequiredArguments()).
' ['.
$class::getHelpTextForOptionalArguments().
' ...]';
} else if ($this is CLIWithArguments) {
$class = TypeAssert\classname_of(CLIWithArguments::class, static::class);
$usage .= ' ['.$class::getHelpTextForOptionalArguments().' ...]';
}
await $out->writeAllAsync($usage."\n");
if (C\is_empty($opts)) {
return;
}
await $out->writeAllAsync("\nOptions:\n");
foreach ($opts as $opt) {
$short = $opt->getShort();
$long = $opt->getLong();
if ($opt is CLIOptions\CLIOptionWithRequiredValue) {
$long .= '=VALUE';
if ($short !== null) {
$short .= ' VALUE';
}
}
if ($short !== null) {
/* HHAST_IGNORE_ERROR[DontAwaitInALoop] */
await $out->writeAllAsync(Str\format(" -%s, --%s\n", $short, $long));
} else {
/* HHAST_IGNORE_ERROR[DontAwaitInALoop] */
await $out->writeAllAsync(Str\format(" --%s\n", $long));
}
/* HHAST_IGNORE_ERROR[DontAwaitInALoop] */
await $out->writeAllAsync(
$opt->getHelpText()
|> Str\split($$, "\n")
|> Vec\map($$, $line ==> "\t".$line."\n")
|> \implode('', $$),
);
}
await $out->writeAllAsync(" -h, --help\n");
await $out->writeAllAsync("\tdisplay this text and exit\n");
}