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@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to