@@ -13,9 +13,7 @@ _[Click here to view the old beta 4 README](README-beta4.md)_
13
13
* ` Input.context ` helper allows you to pass the ` ActionContext ` to your action function which is necessary for some operations.
14
14
* ` Input.validate ` helper allows you to validate against parsed value using the F# ` Result ` type.
15
15
16
- ## Examples
17
-
18
- ### Simple App
16
+ ## Example
19
17
20
18
``` F#
21
19
open System.IO
@@ -62,6 +60,62 @@ let main argv =
62
60
_ Notice that mismatches between the ` setAction ` and the ` inputs ` are caught as a compile time error:_
63
61
![ fs scl demo] ( https://user-images.githubusercontent.com/1030435/164288239-e0ff595d-cdb2-47f8-9381-50c89aedd481.gif )
64
62
63
+ ## Input API
64
+ The new ` Input ` module contains functions for the underlying System.CommandLine ` Option ` and ` Argument ` properties.
65
+ * ` context ` passes an ` ActionContext ` containing a ` ParseResult ` and ` CancellationToken ` to the action
66
+ * ` argument ` creates a named ` Argument<'T> `
67
+ * ` argumentMaybe ` creates a named ` Argument<'T option> ` that defaults to ` None ` .
68
+ * ` option ` creates a named ` Option<'T> `
69
+ * ` optionMaybe ` creates a named ` Option<'T option> ` that defaults to ` None ` .
70
+ * ` alias ` adds an ` Alias ` to an ` Option `
71
+ * ` aliases ` adds one or more aliases to an ` Option `
72
+ * ` desc ` adds a description to an ` Option ` or ` Argument `
73
+ * ` defaultValue ` or ` def ` provides a default value to an ` Option ` or ` Argument `
74
+ * ` defFactor ` assigns a default value factor to an ` Option ` or ` Argument `
75
+ * ` required ` marks an ` Option ` as required
76
+ * ` validate ` allows you to return a ` Result<unit, string> ` for the parsed value
77
+ * ` addValidator ` allows you to add a validator to the underlying ` Option ` or ` Argument `
78
+ * ` editOption ` allows you to pass a function to edit the underlying ` Option `
79
+ * ` editArgument ` allows you to pass a function to edit the underlying ` Argument `
80
+ * ` ofOption ` allows you to pass a manually created ` Option `
81
+ * ` ofArgument ` allows you to pass a manually created ` Argument `
82
+
83
+ ### Extensibility
84
+ You can easily compose your own custom ` Input ` functions with ` editOption ` and ` editArgument ` .
85
+ For example, this is how the existing ` alias ` and ` desc ` functions were created:
86
+
87
+ ``` fsharp
88
+ let alias (alias: string) (input: ActionInput<'T>) =
89
+ input
90
+ |> editOption (fun o -> o.Aliases.Add alias)
91
+
92
+ let desc (description: string) (input: ActionInput<'T>) =
93
+ input
94
+ |> editOption (fun o -> o.Description <- description)
95
+ |> editArgument (fun a -> a.Description <- description)
96
+ ```
97
+ * _ Since ` alias ` can only apply to ` Option ` , it only calls ` editOption ` _
98
+ * _ Since ` desc ` can apply to both ` Option ` and ` Argument ` , you need to use both_
99
+
100
+ You could just as easily create a custom ` Input.validateFileExists ` function:
101
+ ``` fsharp
102
+ let validateFileExists (input: ActionInput<'T>) =
103
+ input
104
+ |> validate (fun file ->
105
+ if file.Exists then Ok ()
106
+ else Error $"File '{file.FullName}' does not exist."
107
+ )
108
+ ```
109
+
110
+ And then use it like this:
111
+ ``` fsharp
112
+ let zipFile =
113
+ argument "zipfile"
114
+ |> desc "The file to unzip"
115
+ |> validateFileExists
116
+ ```
117
+
118
+ ## More Examples
65
119
66
120
### Simple App that Returns a Status Code
67
121
0 commit comments