Skip to content

Commit 0a3090f

Browse files
committed
feat: remove unused fromValue method and add toSafeCallable for improved error handling
1 parent da5a447 commit 0a3090f

File tree

2 files changed

+34
-31
lines changed

2 files changed

+34
-31
lines changed

src/result/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export { safeTry } from "./helper";
2-
export { Result, err, ok } from "./result";
2+
export { err, ok, Result } from "./result";
33

44
export type { Err, Ok } from "./result";
55
export type {

src/result/result.ts

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -33,35 +33,6 @@ export class Result<T = unknown, E = unknown> {
3333
return new Result(false, error, never);
3434
}
3535

36-
static fromValue<T, E = unknown>(data: Promise<T>): Promise<Result<Awaited<T>, E>>;
37-
static fromValue<T>(
38-
data: Promise<T>,
39-
onThrow: ErrorConstructor,
40-
): Promise<Result<Awaited<T>, Error>>;
41-
static fromValue<T, E>(
42-
data: Promise<T>,
43-
onThrow: (error: unknown) => E,
44-
): Promise<Result<Awaited<T>, E>>;
45-
46-
static fromValue<T, E = unknown>(data: T): Result<T, E>;
47-
static fromValue<T>(data: T, onThrow: ErrorConstructor): Result<T, Error>;
48-
static fromValue<T, E>(data: T, onThrow: (error: unknown) => E): Result<T, E>;
49-
50-
static fromValue(data: unknown, onThrow?: Fn): any {
51-
try {
52-
if (!isPromiseLike(data)) {
53-
return this.ok(data);
54-
}
55-
56-
return data.then(
57-
value => this.ok(value),
58-
error => this.err(transformError(error, onThrow)),
59-
);
60-
} catch (error) {
61-
return this.err(transformError(error, onThrow));
62-
}
63-
}
64-
6536
static fromCallable<T, E = unknown>(callable: SyncFn<T>): Result<T, E>;
6637
static fromCallable<T>(callable: SyncFn<T>, onThrow: ErrorConstructor): Result<T, Error>;
6738
static fromCallable<T, E>(callable: SyncFn<T>, onThrow: (error: unknown) => E): Result<T, E>;
@@ -79,7 +50,9 @@ export class Result<T = unknown, E = unknown> {
7950
static fromCallable(callable: unknown, onThrow?: Fn): any {
8051
try {
8152
if (!isFunction(callable)) {
82-
return this.ok(callable);
53+
const error = new TypeError("Provided argument is not callable");
54+
55+
return this.err(transformError(error, onThrow));
8356
}
8457

8558
const data = callable();
@@ -96,6 +69,36 @@ export class Result<T = unknown, E = unknown> {
9669
}
9770
}
9871

72+
static toSafeCallable<A extends any[], T, E = unknown>(
73+
callable: SyncFn<T, A>,
74+
): SyncFn<Result<T, E>, A>;
75+
static toSafeCallable<A extends any[], T>(
76+
callable: SyncFn<T, A>,
77+
onThrow: ErrorConstructor,
78+
): SyncFn<Result<T, Error>, A>;
79+
static toSafeCallable<A extends any[], T, E>(
80+
callable: SyncFn<T, A>,
81+
onThrow: (error: unknown) => E,
82+
): SyncFn<Result<T, E>, A>;
83+
84+
static toSafeCallable<A extends any[], T, E = unknown>(
85+
callable: AsyncFn<T, A>,
86+
): AsyncFn<Result<Awaited<T>, E>, A>;
87+
static toSafeCallable<A extends any[], T>(
88+
callable: AsyncFn<T, A>,
89+
onThrowOrReject: ErrorConstructor,
90+
): AsyncFn<Result<Awaited<T>, Error>, A>;
91+
static toSafeCallable<A extends any[], T, E>(
92+
callable: AsyncFn<T, A>,
93+
onThrowOrReject: (error: unknown) => E,
94+
): AsyncFn<Result<Awaited<T>, E>, A>;
95+
96+
static toSafeCallable(callable: unknown, onThrow?: Fn): Fn {
97+
return (...args) => {
98+
return this.fromCallable(() => (callable as Fn)(...args), onThrow as Fn);
99+
};
100+
}
101+
99102
static all<T extends NonEmptyTuple<Result>>(results: T): ResultAll<T>;
100103
static all<T extends readonly Result[]>(results: T): ResultAll<T>;
101104
static all(results: Result[]): ResultAll<Result[]> {

0 commit comments

Comments
 (0)