The kotlin-kli libray offers sleek command line parsing for the Kotlin programming language. It uses class introspection to automatically discover defined options in your code.
It's primary goal is ease-of-use with minimal configuration overhead.
The key features are:
- Ability to parse standard POSIX command line options
(both long versions
--long-optionand short options-x) - Using introspection to build the option parser based on your application code
- Handling unspecified options
- Automatic generation of usage and help texts
- Automatic validation of mandatory options
- Automatic validation of option values (numbers, files, directories)
- Proper parsing and validation of positional arguments
- Automatic recognition of the end of options delimiter (
--)
- Parsing Windows-style options (
/hand alike)
The following example code can parse the following command lines:
app -finput.txt -pmi.e. "abbreviated old-school short options"app -f input.txt -p -mi.e. "regular single-character options"app --input-file=input.txt --progressive --moderni.e. "modern GNU style options"
It can also parse combinations of the above, like
app -pm --input-file=input.txtapp --modern -p --input-file input.txt
import de.csou.arch.kli.*
fun main (args:Array<String>) {
val kli = object:Kli() {
val fileOption = ReadableFileOption(description="The input file to read.", shortId='f', longId="input-file")
val progressiveFlag = FlagOption("Whether to read the file in progressive mode", 'p', "progressive")
val modernFlag = FlagOption("Whether to read the file in modern mode.", 'm', "modern")
}
kli.parse(args)
println("Input file: ${kli.fileOption.value}")
println("Progressive: ${kli.progressiveFlag.isDefined}")
println("Modern: ${kli.modernFlag.isDefined}")
}kotlin-kli can automatically validate the option values during or after the argument parsing by passing the option validate parameter, e.g.
kli.parse(args, validate=true)Supported validation rules are:
- Mandatory/option values
- Value classes: Strings, Integers, Decimals
- Readable/Writable files
- Readable/Writable directories
kotlin-kli automatically recognizes non-optionized arguments as so called positional arguments. Positional arguments can be read individually or using logical grouping (first, last, all-but-first, all-but-last). These access functions also support value validation and type casting, e.g.:
val arg1:String = kli.parseFirstArgument(StringParser())
val lastArgs:List<Double> = kli.parseTailArguments(DoubleParser())kotlin-kli includes a predefined HelpOption class which, when added to your Kli object can automatically
print a help text to the console.
The following code
import de.csou.arch.kli.*
fun main (args:Array<String>) {
val kli = object:Kli() {
val helpOption = StandardHelpOption()
.addUsage("app [flags] -f FILE")
.addExample("app -f FILE", "Processing file FILE in default mode.")
.addExample("app -pf FILE", "Processing file FILE in progressive mode.")
val stringOption = StringOption(type="STRING", description="The string to process.", shortId='s', longId="input-string", isMandatory=true)
val progressiveFlag = FlagOption("Whether to process the string in progressive mode", 'p', "progressive")
val modernFlag = FlagOption("Whether to process the string in modern mode.", 'm', "modern")
}
kli.parse(args, validate=true)
}will print the following help text when invoked with -h or --help:
Usage: app [flags] -f FILE
Examples:
app -f FILE Processing file FILE in default mode.
app -pf FILE Processing file FILE in progressive mode.
Options:
-h, --help Display this help screen.
-m, --modern Whether to process the string in modern mode.
-p, --progressive Whether to process the string in progressive mode
-s, --input-string The string to process.