-
Notifications
You must be signed in to change notification settings - Fork 0
/
tryDo.ts
37 lines (34 loc) · 952 Bytes
/
tryDo.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import type { IsAny, IsNever } from '../types'
import { isPromise, toStr } from '../utils'
import { err, ok, type Result } from './result'
type TryDoResult<T> =
IsNever<T> extends true
? never
: IsAny<T> extends true
? unknown
: T extends Promise<infer U>
? Promise<Result<Awaited<U>>>
: Result<T>
/**
* Convert the result of `fn` to `Result`. Automatically catch error.
*
* @example
* ```typescript
* const obj = {}
* tryDo(() => obj.a.b) // get a failure Result
* ```
*
* {@link https://github.com/niuiic/fx-flow/blob/main/packages/test/src/flow/tryDo.spec.ts | More examples}
*/
function tryDo<A>(fn: () => A): TryDoResult<A> {
try {
const res = fn()
if (isPromise(res)) {
return res.then((x) => ok(x)).catch((x) => err(toStr(x))) as TryDoResult<A>
}
return ok(res) as TryDoResult<A>
} catch (error) {
return err(toStr(error)) as TryDoResult<A>
}
}
export { tryDo }