File tree Expand file tree Collapse file tree 8 files changed +83
-1
lines changed
FsToolkit.ErrorHandling.JobResult
FsToolkit.ErrorHandling.JobResult.Tests
FsToolkit.ErrorHandling.TaskResult.Tests
FsToolkit.ErrorHandling.Tests Expand file tree Collapse file tree 8 files changed +83
-1
lines changed Original file line number Diff line number Diff line change 1- namespace FsToolkit.ErrorHandling
1+ namespace FsToolkit.ErrorHandling
22
33open Hopac
44open Hopac.Infixes
@@ -124,6 +124,10 @@ module JobResult =
124124 option
125125 |> Job.map ( Result.requireSome error)
126126
127+ let inline requireSomeWith error option =
128+ option
129+ |> Job.map ( Result.requireSomeWith error)
130+
127131 // Converts an job-wrapped Option to a Result, using the given error if Some.
128132 let inline requireNone error option =
129133 option
Original file line number Diff line number Diff line change @@ -157,6 +157,13 @@ module AsyncResult =
157157 value
158158 |> Async.map ( Result.requireSome error)
159159
160+ let inline requireSomeWith
161+ ( ifErrorThunk : unit -> 'error )
162+ ( value : Async < 'ok option >)
163+ : Async < Result < 'ok , 'error >> =
164+ value
165+ |> Async.map ( Result.requireSomeWith ifErrorThunk)
166+
160167 // Converts an async-wrapped Option to a Result, using the given error if Some.
161168 let inline requireNone
162169 ( error : 'error )
Original file line number Diff line number Diff line change @@ -307,6 +307,14 @@ module Result =
307307 | Some x -> Ok x
308308 | None -> Error error
309309
310+ let inline requireSomeWith
311+ ( ifErrorThunk : unit -> 'error )
312+ ( option : 'ok option )
313+ : Result < 'ok , 'error > =
314+ match option with
315+ | Some x -> Ok x
316+ | None -> Error( ifErrorThunk ())
317+
310318 /// <summary>
311319 /// Requires a value to be <c>None</c>, otherwise returns an error result.
312320 ///
Original file line number Diff line number Diff line change @@ -109,6 +109,10 @@ module TaskResult =
109109 option
110110 |> Task.map ( Result.requireSome error)
111111
112+ let inline requireSomeWith error option =
113+ option
114+ |> Task.map ( Result.requireSomeWith error)
115+
112116 // Converts an task-wrapped Option to a Result, using the given error if Some.
113117 let inline requireNone error option =
114118 option
Original file line number Diff line number Diff line change @@ -284,6 +284,22 @@ let requireSomeTests =
284284 |> Expect.hasJobErrorValueSync err
285285 ]
286286
287+ [<Tests>]
288+ let requireSomeWithTests =
289+ testList " JobResult.requireSomeWith Tests" [
290+ testCase " requireSomeWith happy path"
291+ <| fun _ ->
292+ toJob ( Some 42 )
293+ |> JobResult.requireSomeWith ( fun () -> err)
294+ |> Expect.hasJobOkValueSync 42
295+
296+ testCase " requireSomeWith error path"
297+ <| fun _ ->
298+ toJob None
299+ |> JobResult.requireSomeWith ( fun () -> err)
300+ |> Expect.hasJobErrorValueSync err
301+ ]
302+
287303[<Tests>]
288304let requireNoneTests =
289305 testList " JobResult.requireNone Tests" [
Original file line number Diff line number Diff line change @@ -289,6 +289,22 @@ let requireSomeTests =
289289 |> Expect.hasTaskErrorValueSync err
290290 ]
291291
292+ [<Tests>]
293+ let requireSomeWithTests =
294+ testList " TaskResult.requireSomeWith Tests" [
295+ testCase " requireSomeWith happy path"
296+ <| fun _ ->
297+ toTask ( Some 42 )
298+ |> TaskResult.requireSomeWith ( fun () -> err)
299+ |> Expect.hasTaskOkValueSync 42
300+
301+ testCase " requireSomeWith error path"
302+ <| fun _ ->
303+ toTask None
304+ |> TaskResult.requireSomeWith ( fun () -> err)
305+ |> Expect.hasTaskErrorValueSync err
306+ ]
307+
292308[<Tests>]
293309let requireNoneTests =
294310 testList " TaskResult.requireNone Tests" [
Original file line number Diff line number Diff line change @@ -298,6 +298,18 @@ let requireSomeTests =
298298 |> Expect.hasAsyncErrorValue err)
299299 ]
300300
301+ let requireSomeWithTests =
302+ testList " AsyncResult.requireSomeWith Tests" [
303+ testCaseAsync " requireSomeWith happy path"
304+ <| ( toAsync ( Some 42 )
305+ |> AsyncResult.requireSomeWith ( fun () -> err)
306+ |> Expect.hasAsyncOkValue 42 )
307+
308+ testCaseAsync " requireSomeWith error path"
309+ <| ( toAsync None
310+ |> AsyncResult.requireSomeWith ( fun () -> err)
311+ |> Expect.hasAsyncErrorValue err)
312+ ]
301313
302314let requireNoneTests =
303315 testList " AsyncResult.requireNone Tests" [
@@ -1006,6 +1018,7 @@ let allTests =
10061018 requireTrueTests
10071019 requireFalseTests
10081020 requireSomeTests
1021+ requireSomeWithTests
10091022 requireNoneTests
10101023 requireValueSomeTests
10111024 requireValueNoneTests
Original file line number Diff line number Diff line change @@ -332,6 +332,19 @@ let requireSomeTests =
332332 |> Expect.hasErrorValue err
333333 ]
334334
335+ let requireSomeWithTests =
336+ testList " requireSomeWith Tests" [
337+ testCase " requireSomeWith happy path"
338+ <| fun _ ->
339+ Result.requireSomeWith ( fun () -> err) ( Some 42 )
340+ |> Expect.hasOkValue 42
341+
342+ testCase " requireSomeWith error path"
343+ <| fun _ ->
344+ Result.requireSomeWith ( fun () -> err) None
345+ |> Expect.hasErrorValue err
346+ ]
347+
335348let requireNotNullTests =
336349 testList " requireNotNull Tests" [
337350 testCase " requireNotNull happy path"
@@ -914,6 +927,7 @@ let allTests =
914927 requireTrueTests
915928 requireFalseTests
916929 requireSomeTests
930+ requireSomeWithTests
917931 requireNoneTests
918932 requireValueSomeTests
919933 requireValueNoneTests
You can’t perform that action at this time.
0 commit comments