[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