[fpc-pascal] I'm working on automated Help Output for console apps
Benito van der Zander
benito at benibela.de
Fri Nov 20 11:38:21 CET 2020
Hi,
I also made such a thing:
var optionsreader: TCommandLineReader;
begin
optionsreader := TCommandLineReader.create;
optionsreader.declareFile('file', 'The file to be processed');
optionsreader.addAbbreviation('f');
optionsreader.declareFlag('help', '');
optionsreader.addAbbreviation('h');
optionsreader.declareFlag('version', 'Print the version of the
application');
optionsreader.addAbbreviation('v');
if optionsreader.existsProperty('help') then
writeln(optionsreader.availableOptions);
end.
Output:
--file=<file> or -f The file to be processed
--help or -h
--version or -v Print the version of the application
You can download it at http://www.benibela.de/sources_en.html#rcmdline
Benito
On 20.11.20 01:33, Graeme Geldenhuys via fpc-pascal wrote:
> Hi,
>
> I'm working on a automated help output writer(s) for console apps.
> Thus no more tedious and ugly output when you do: myapp -h
>
> My aims:
> * I write a lot of console apps, so this would be very useful to me.
> * Ability to swap out the help formatter. It's interface based, so
> custom implementations can easily be created.
> * Auto align help options and descriptions - the most annoying thing to
> do manually. ;-)
> * Ability to define console width in which to format and wrap the help
> output, but has a default value.
> * The idea is loosely base on the Java version found in Apache Commons.
>
> When it's done I'll obviously shared it as open source somewhere.
>
> With that said, below is how I currently use it. It uses the Builder design
> pattern so gives it the Chain Invocations syntax. I know it's not something
> often seen in Pascal programs, but it makes it very easy to read and easy
> to use/type, especially with code completion editors like Lazarus IDE.
>
> For those console programmers out there... Is there anything in console help
> output that you like or wish you had. That way I could possibly add it and
> make this even more useful to a wider audience.
>
> I'm still working on AppName, Version and Usage output.
>
> Example code:
> ==========================
> var
> optionlist: TOptions;
> helpFormatter: IHelpFormatter;
> header: string;
> footer: string;
> begin
> optionlist := TOptions.Create;
>
> optionlist.add(TOption.Builder
> .isRequired
> .withDescription('The file to be processed')
> .hasArg
> .withArgName('file')
> .withLongOpt('file')
> .build('f')); // build() always takes the mandatory short option.
>
> optionlist.add(TOption.Builder
> .withLongOpt('help')
> .withArgName('test') // this is ignored because .hasArg was not specified
> .build('h'));
>
> optionlist.add(TOption.Builder
> .withDescription('Print the version of the application')
> .withLongOpt('version')
> .build('v'));
>
> header := 'Do something useful with an input file' + LineEnding;
> footer := LineEnding + 'Please report issues at http://example.com/issues';
>
> helpFormatter := TBasicHelpFormatter.Create();
>
> // sample outputs with increasing verbosity
>
> writeln('=========================== (1)');
> helpFormatter.printHelp(optionlist);
>
> writeln('=========================== (2)');
> helpFormatter.printHelp('DocView v1.0', optionlist);
>
> writeln('=========================== (3)');
> helpFormatter.printHelp('DocView v1.0', header, optionlist, footer);
>
> writeln('========== the end =================');
> optionlist.Free;
> end;
> ==========================
>
>
> And here is the example output for the 3 options so far:
>
> =========================== (1)
> * -f,--file <FILE> The file to be processed
> -h,--help
> -v,--version Print the version of the application
>
> * indicates required parameters
> =========================== (2)
> DocView v1.0
> * -f,--file <FILE> The file to be processed
> -h,--help
> -v,--version Print the version of the application
>
> * indicates required parameters
> =========================== (3)
> DocView v1.0
> Do something useful with an input file
>
> * -f,--file <FILE> The file to be processed
> -h,--help
> -v,--version Print the version of the application
>
> * indicates required parameters
>
> Please report issues at http://example.com/issues
> ========== the end =================
>
>
>
> Regards,
> Graeme
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20201120/ef3151e4/attachment.htm>
More information about the fpc-pascal
mailing list