Handling of greater than 8 inputs
This release provides a convenient way to handle commands that require more than 8 inputs via the new add
custom operation on the rootCommand
and command
builders.
Additional info
Currently, a command handler function is limited to accept a tuple with no more than eight inputs.
If you need more than eight inputs, you can now pass in the InvocationContext
to your handler, which will allow you manually get as many input values as you like (assuming they have been registered via the rootCommand
or command
builder's add
operation:
module Program
open FSharp.SystemCommandLine
module Parameters =
let words = Input.Option<string[]>(["--word"; "-w"], Array.empty, "A list of words to be appended")
let separator = Input.OptionMaybe<string>(["--separator"; "-s"], "A character that will separate the joined words.")
let app (ctx: System.CommandLine.Invocation.InvocationContext) =
// Manually parse as many parameters as you need
let words = Parameters.words.GetValue ctx
let separator = Parameters.separator.GetValue ctx
// Do work
let separator = separator |> Option.defaultValue ", "
System.String.Join(separator, words) |> printfn "Result: %s"
0
[<EntryPoint>]
let main argv =
let ctx = Input.Context()
rootCommand argv {
description "Appends words together"
inputs ctx
setHandler app
add Parameters.words
add Parameters.separator
}
Caveats
This manual binding mechanism is less type safe because the compiler has no way to determine if you have manually added all input parameters to the command; so if you forget to add one that is used, it will result in a runtime error.
(For this reason, you should try to limit your commands to 8 parameters when possible, by factoring your app into separate commands.)