Skip to content

Commit 554a682

Browse files
committed
Started to restructure to beta4 changes.
1 parent 29ca0f8 commit 554a682

4 files changed

Lines changed: 116 additions & 62 deletions

File tree

src/FSharp.SystemCommandLine/CommandBuilders.fs

Lines changed: 86 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ type private HI<'T> = HandlerInput<'T>
1212
type private IC = System.CommandLine.Invocation.InvocationContext
1313
let private def<'T> = Unchecked.defaultof<'T>
1414

15+
/// Casts an IValueDescriptor to an IValueDescriptor<'T>
16+
let castValueDescriptor (ivdInputs: IValueDescriptor list) (idx: int) =
17+
ivdInputs[idx] :?> IValueDescriptor<'InputType>
18+
1519
type CommandSpec<'Inputs, 'Output> =
1620
{
1721
Description: string
@@ -139,7 +143,7 @@ type BaseCommandBuilder<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N,
139143
match input.Source with
140144
| ParsedOption o -> cmd.AddOption o
141145
| ParsedArgument a -> cmd.AddArgument a
142-
| InjectedDependency -> () // DI system will inject this input
146+
| InjectedDependency -> ()
143147
)
144148

145149
spec.SubCommands |> List.iter cmd.AddCommand
@@ -149,34 +153,28 @@ type BaseCommandBuilder<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N,
149153
member this.SetActionHandler (spec: CommandSpec<'Inputs, unit>) (cmd: Command) =
150154
let handler (args: obj) = spec.Handler (args :?> 'Inputs)
151155

152-
let inputs =
156+
let valueDescriptors =
153157
spec.Inputs
154158
|> List.choose (fun input ->
155159
match input.Source with
156160
| ParsedOption o -> o :> IValueDescriptor |> Some
157161
| ParsedArgument a -> a :> IValueDescriptor |> Some
158162
| InjectedDependency -> None
159163
)
160-
|> List.toArray
164+
165+
/// Casts an IValueDescriptor to an IValueDescriptor<'T>
166+
let cvd idx = castValueDescriptor valueDescriptors idx
161167

162168
match spec.Inputs.Length with
163169
| 00 -> cmd.SetHandler(Action(fun () -> handler ()))
164-
| 01 -> cmd.SetHandler(Action<'A>(fun a -> handler (a)), inputs)
165-
| 02 -> cmd.SetHandler(Action<'A, 'B>(fun a b -> handler (a, b)), inputs)
166-
| 03 -> cmd.SetHandler(Action<'A, 'B, 'C>(fun a b c -> handler (a, b, c)), inputs)
167-
| 04 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D>(fun a b c d -> handler (a, b, c, d)), inputs)
168-
| 05 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E>(fun a b c d e -> handler (a, b, c, d, e)), inputs)
169-
| 06 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F>(fun a b c d e f -> handler (a, b, c, d, e, f)), inputs)
170-
| 07 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G>(fun a b c d e f g -> handler (a, b, c, d, e, f, g)), inputs)
171-
| 08 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H>(fun a b c d e f g h -> handler (a, b, c, d, e, f, g, h)), inputs)
172-
| 09 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I>(fun a b c d e f g h i -> handler (a, b, c, d, e, f, g, h, i)), inputs)
173-
| 10 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J>(fun a b c d e f g h i j -> handler (a, b, c, d, e, f, g, h, i, j)), inputs)
174-
| 11 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K>(fun a b c d e f g h i j k -> handler (a, b, c, d, e, f, g, h, i, j, k)), inputs)
175-
| 12 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L>(fun a b c d e f g h i j k l -> handler (a, b, c, d, e, f, g, h, i, j, k, l)), inputs)
176-
| 13 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M>(fun a b c d e f g h i j k l m -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m)), inputs)
177-
| 14 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N>(fun a b c d e f g h i j k l m n -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n)), inputs)
178-
| 15 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O>(fun a b c d e f g h i j k l m n o -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)), inputs)
179-
| 16 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O, 'P>(fun a b c d e f g h i j k l m n o p -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)), inputs)
170+
| 01 -> cmd.SetHandler(Action<'A>(fun a -> handler (a)), cvd 0)
171+
| 02 -> cmd.SetHandler(Action<'A, 'B>(fun a b -> handler (a, b)), cvd 0, cvd 1)
172+
| 03 -> cmd.SetHandler(Action<'A, 'B, 'C>(fun a b c -> handler (a, b, c)), cvd 0, cvd 1, cvd 2)
173+
| 04 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D>(fun a b c d -> handler (a, b, c, d)), cvd 0, cvd 1, cvd 2, cvd 3)
174+
| 05 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E>(fun a b c d e -> handler (a, b, c, d, e)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4)
175+
| 06 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F>(fun a b c d e f -> handler (a, b, c, d, e, f)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5)
176+
| 07 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G>(fun a b c d e f g -> handler (a, b, c, d, e, f, g)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5, cvd 6)
177+
| 08 -> cmd.SetHandler(Action<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H>(fun a b c d e f g h -> handler (a, b, c, d, e, f, g, h)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5, cvd 6, cvd 7)
180178
| _ -> raise (NotImplementedException())
181179
cmd
182180

@@ -185,33 +183,66 @@ type BaseCommandBuilder<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N,
185183
let handler (args: obj) =
186184
spec.Handler (args :?> 'Inputs)
187185

188-
let inputs =
189-
spec.Inputs
190-
|> List.choose (fun input ->
191-
match input.Source with
192-
| ParsedOption o -> o :> IValueDescriptor |> Some
193-
| ParsedArgument a -> a :> IValueDescriptor |> Some
194-
| InjectedDependency -> None
195-
)
196-
|> List.toArray
186+
let getValue (ctx: IC) (idx: int) =
187+
match spec.Inputs[idx].Source with
188+
| ParsedOption o -> ctx.ParseResult.GetValueForOption(o)
189+
| ParsedArgument a -> ctx.ParseResult.GetValueForArgument(a)
190+
| InjectedDependency -> ctx
197191

198192
match spec.Inputs.Length with
199193
| 00 -> cmd.SetHandler(Action<IC>(fun ctx -> ctx.ExitCode <- handler ()))
200-
| 01 -> cmd.SetHandler(Action<IC, 'A>(fun ctx a -> ctx.ExitCode <- handler (a)), inputs)
201-
| 02 -> cmd.SetHandler(Action<IC, 'A, 'B>(fun ctx a b -> ctx.ExitCode <- handler (a, b)), inputs)
202-
| 03 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C>(fun ctx a b c -> ctx.ExitCode <- handler (a, b, c)), inputs)
203-
| 04 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D>(fun ctx a b c d -> ctx.ExitCode <- handler (a, b, c, d)), inputs)
204-
| 05 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E>(fun ctx a b c d e -> ctx.ExitCode <- handler (a, b, c, d, e)), inputs)
205-
| 06 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F>(fun ctx a b c d e f -> ctx.ExitCode <- handler (a, b, c, d, e, f)), inputs)
206-
| 07 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G>(fun ctx a b c d e f g -> ctx.ExitCode <- handler (a, b, c, d, e, f, g)), inputs)
207-
| 08 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H>(fun ctx a b c d e f g h -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h)), inputs)
208-
| 09 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I>(fun ctx a b c d e f g h i -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i)), inputs)
209-
| 10 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J>(fun ctx a b c d e f g h i j -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j)), inputs)
210-
| 11 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K>(fun ctx a b c d e f g h i j k -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j, k)), inputs)
211-
| 12 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L>(fun ctx a b c d e f g h i j k l -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j, k, l)), inputs)
212-
| 13 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M>(fun ctx a b c d e f g h i j k l m -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j, k, l, m)), inputs)
213-
| 14 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N>(fun ctx a b c d e f g h i j k l m n -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n)), inputs)
214-
| 15 -> cmd.SetHandler(Action<IC, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O>(fun ctx a b c d e f g h i j k l m n o -> ctx.ExitCode <- handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)), inputs)
194+
| 01 -> cmd.SetHandler(Action<IC>(fun ctx ->
195+
let a = getValue ctx 0 :?> 'A
196+
ctx.ExitCode <- handler (a)))
197+
| 02 -> cmd.SetHandler(Action<IC>(fun ctx ->
198+
let a = getValue ctx 0 :?> 'A
199+
let b = getValue ctx 1 :?> 'B
200+
ctx.ExitCode <- handler (a, b)))
201+
| 03 -> cmd.SetHandler(Action<IC>(fun ctx ->
202+
let a = getValue ctx 0 :?> 'A
203+
let b = getValue ctx 1 :?> 'B
204+
let c = getValue ctx 2 :?> 'C
205+
ctx.ExitCode <- handler (a, b, c)))
206+
| 04 -> cmd.SetHandler(Action<IC>(fun ctx ->
207+
let a = getValue ctx 0 :?> 'A
208+
let b = getValue ctx 1 :?> 'B
209+
let c = getValue ctx 2 :?> 'C
210+
let d = getValue ctx 3 :?> 'D
211+
ctx.ExitCode <- handler (a, b, c, d)))
212+
| 05 -> cmd.SetHandler(Action<IC>(fun ctx ->
213+
let a = getValue ctx 0 :?> 'A
214+
let b = getValue ctx 1 :?> 'B
215+
let c = getValue ctx 2 :?> 'C
216+
let d = getValue ctx 3 :?> 'D
217+
let e = getValue ctx 4 :?> 'E
218+
ctx.ExitCode <- handler (a, b, c, d, e)))
219+
| 06 -> cmd.SetHandler(Action<IC>(fun ctx ->
220+
let a = getValue ctx 0 :?> 'A
221+
let b = getValue ctx 1 :?> 'B
222+
let c = getValue ctx 2 :?> 'C
223+
let d = getValue ctx 3 :?> 'D
224+
let e = getValue ctx 4 :?> 'E
225+
let f = getValue ctx 5 :?> 'F
226+
ctx.ExitCode <- handler (a, b, c, d, e, f)))
227+
| 07 -> cmd.SetHandler(Action<IC>(fun ctx ->
228+
let a = getValue ctx 0 :?> 'A
229+
let b = getValue ctx 1 :?> 'B
230+
let c = getValue ctx 2 :?> 'C
231+
let d = getValue ctx 3 :?> 'D
232+
let e = getValue ctx 4 :?> 'E
233+
let f = getValue ctx 5 :?> 'F
234+
let g = getValue ctx 6 :?> 'G
235+
ctx.ExitCode <- handler (a, b, c, d, e, f, g)))
236+
| 08 -> cmd.SetHandler(Action<IC>(fun ctx ->
237+
let a = getValue ctx 0 :?> 'A
238+
let b = getValue ctx 1 :?> 'B
239+
let c = getValue ctx 2 :?> 'C
240+
let d = getValue ctx 3 :?> 'D
241+
let e = getValue ctx 4 :?> 'E
242+
let f = getValue ctx 5 :?> 'F
243+
let g = getValue ctx 6 :?> 'G
244+
let h = getValue ctx 7 :?> 'H
245+
ctx.ExitCode <- handler (a, b, c, d, e, f, g, h)))
215246
| _ -> raise (NotImplementedException())
216247
cmd
217248

@@ -222,34 +253,28 @@ type BaseCommandBuilder<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N,
222253
return! spec.Handler (args :?> 'Inputs)
223254
}
224255

225-
let inputs =
256+
let valueDescriptors =
226257
spec.Inputs
227258
|> List.choose (fun input ->
228259
match input.Source with
229260
| ParsedOption o -> o :> IValueDescriptor |> Some
230261
| ParsedArgument a -> a :> IValueDescriptor |> Some
231262
| InjectedDependency -> None
232263
)
233-
|> List.toArray
264+
265+
/// Casts an IValueDescriptor to an IValueDescriptor<'T>
266+
let cvd idx = castValueDescriptor valueDescriptors idx
234267

235268
match spec.Inputs.Length with
236269
| 00 -> cmd.SetHandler(Func<Task>(fun () -> handler ()))
237-
| 01 -> cmd.SetHandler(Func<'A, Task>(fun a -> handler (a)), inputs)
238-
| 02 -> cmd.SetHandler(Func<'A, 'B, Task>(fun a b -> handler (a, b)), inputs)
239-
| 03 -> cmd.SetHandler(Func<'A, 'B, 'C, Task>(fun a b c -> handler (a, b, c)), inputs)
240-
| 04 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, Task>(fun a b c d -> handler (a, b, c, d)), inputs)
241-
| 05 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, Task>(fun a b c d e -> handler (a, b, c, d, e)), inputs)
242-
| 06 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, Task>(fun a b c d e f -> handler (a, b, c, d, e, f)), inputs)
243-
| 07 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, Task>(fun a b c d e f g -> handler (a, b, c, d, e, f, g)), inputs)
244-
| 08 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, Task>(fun a b c d e f g h -> handler (a, b, c, d, e, f, g, h)), inputs)
245-
| 09 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, Task>(fun a b c d e f g h i -> handler (a, b, c, d, e, f, g, h, i)), inputs)
246-
| 10 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, Task>(fun a b c d e f g h i j -> handler (a, b, c, d, e, f, g, h, i, j)), inputs)
247-
| 11 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, Task>(fun a b c d e f g h i j k -> handler (a, b, c, d, e, f, g, h, i, j, k)), inputs)
248-
| 12 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, Task>(fun a b c d e f g h i j k l -> handler (a, b, c, d, e, f, g, h, i, j, k, l)), inputs)
249-
| 13 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, Task>(fun a b c d e f g h i j k l m -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m)), inputs)
250-
| 14 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, Task>(fun a b c d e f g h i j k l m n -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n)), inputs)
251-
| 15 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O, Task>(fun a b c d e f g h i j k l m n o -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)), inputs)
252-
| 16 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O, 'P, Task>(fun a b c d e f g h i j k l m n o p -> handler (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)), inputs)
270+
| 01 -> cmd.SetHandler(Func<'A, Task>(fun a -> handler (a)), cvd 0)
271+
| 02 -> cmd.SetHandler(Func<'A, 'B, Task>(fun a b -> handler (a, b)), cvd 0, cvd 1)
272+
| 03 -> cmd.SetHandler(Func<'A, 'B, 'C, Task>(fun a b c -> handler (a, b, c)), cvd 0, cvd 1, cvd 2)
273+
| 04 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, Task>(fun a b c d -> handler (a, b, c, d)), cvd 0, cvd 1, cvd 2, cvd 3)
274+
| 05 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, Task>(fun a b c d e -> handler (a, b, c, d, e)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4)
275+
| 06 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, Task>(fun a b c d e f -> handler (a, b, c, d, e, f)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5)
276+
| 07 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, Task>(fun a b c d e f g -> handler (a, b, c, d, e, f, g)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5, cvd 6)
277+
| 08 -> cmd.SetHandler(Func<'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, Task>(fun a b c d e f g h -> handler (a, b, c, d, e, f, g, h)), cvd 0, cvd 1, cvd 2, cvd 3, cvd 4, cvd 5, cvd 6, cvd 7)
253278
| _ -> raise (NotImplementedException())
254279
cmd
255280

src/FSharp.SystemCommandLine/FSharp.SystemCommandLine.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</ItemGroup>
1818

1919
<ItemGroup>
20-
<PackageReference Include="System.CommandLine" Version="2.0.0-beta3.22114.1" />
20+
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
2121
</ItemGroup>
2222

2323
<ItemGroup>

src/Tests/OptionMaybeBoolTest.fs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,16 @@ let ``04 no option or argument should be None`` () =
5454
handlerCalled <- true
5555
)
5656
} |> ignore
57+
58+
[<Test>]
59+
let ``05 no option or argument should be None with int return`` () =
60+
testRootCommand "--flag" {
61+
description "Test"
62+
inputs (Input.OptionMaybe<bool>("--flag", "True, false or none"))
63+
setHandler (fun flag ->
64+
flag =! Some true
65+
handlerCalled <- true
66+
0
67+
)
68+
} |> ignore
69+

src/Tests/SimpleAppTest.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,19 @@ let ``01 --word Hello -w World -s *`` () =
2525
handlerCalled <- true
2626
)
2727
} |> ignore
28+
29+
[<Test>]
30+
let ``02 --word Hello -w World -s * with int return`` () =
31+
testRootCommand "--word Hello -w World -s *" {
32+
description "Appends words together"
33+
inputs (
34+
Input.Option(["--word"; "-w"], Array.empty, "A list of words to be appended"),
35+
Input.Option(["--separator"; "-s"], ",", "A character that will separate the joined words.")
36+
)
37+
setHandler (fun (words, separator) ->
38+
words =! [| "Hello"; "World" |]
39+
separator =! "*"
40+
handlerCalled <- true
41+
0
42+
)
43+
} |> ignore

0 commit comments

Comments
 (0)