[fpc-pascal] I'm working on automated Help Output for console apps

Amir amir at aavani.net
Fri Nov 20 17:46:38 CET 2020


Hi,

  I also have a similar library for that purpose:

https://github.com/AmirAavani/my-units/blob/master/General-Purpose-Units/ParameterManagerUnit.pp

This library expects "ValidArguments.inc" file whose content is like the 
following:

ValidArgumentsInfo : array of AnsiString = ('--InputFile:AnsiString', 
'--Debug:Boolean');
ValidArgumentsValues : array of AnsiString = ('', 'True');

The second array, ValidArgumentsValue (which should be renamed to 
DefaultValues) set the default values, if none provided.

Amir

On 11/20/20 2:38 AM, Benito van der Zander via fpc-pascal wrote:
> 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 athttp://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 athttp://example.com/issues
>> ========== the end =================
>>
>>
>>
>> Regards,
>>    Graeme
>>
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20201120/3a2fbf3e/attachment.htm>


More information about the fpc-pascal mailing list