Skip to content

Commit d5ccc9a

Browse files
committed
add requireSomeWith
1 parent e713f86 commit d5ccc9a

File tree

8 files changed

+83
-1
lines changed

8 files changed

+83
-1
lines changed

src/FsToolkit.ErrorHandling.JobResult/JobResult.fs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace FsToolkit.ErrorHandling
1+
namespace FsToolkit.ErrorHandling
22

33
open Hopac
44
open 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

src/FsToolkit.ErrorHandling/AsyncResult.fs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff 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)

src/FsToolkit.ErrorHandling/Result.fs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff 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
///

src/FsToolkit.ErrorHandling/TaskResult.fs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff 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

tests/FsToolkit.ErrorHandling.JobResult.Tests/JobResult.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff 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>]
288304
let requireNoneTests =
289305
testList "JobResult.requireNone Tests" [

tests/FsToolkit.ErrorHandling.TaskResult.Tests/TaskResult.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff 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>]
293309
let requireNoneTests =
294310
testList "TaskResult.requireNone Tests" [

tests/FsToolkit.ErrorHandling.Tests/AsyncResult.fs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff 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

302314
let 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

tests/FsToolkit.ErrorHandling.Tests/Result.fs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
335348
let 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

0 commit comments

Comments
 (0)