Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/util/common/result.ts
13397 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { ErrorUtils } from './errors';
7
8
export type Result<T, E> = ResultOk<T> | ResultError<E>;
9
10
export namespace Result {
11
12
export function ok<T>(value: T): ResultOk<T> {
13
return new ResultOk(value);
14
}
15
16
export function error<E>(value: E): ResultError<E> {
17
return new ResultError(value);
18
}
19
20
export function fromString(errorMessage: string): ResultError<Error> {
21
return Result.error(new Error(errorMessage));
22
}
23
24
export function tryWith<T>(f: () => T): Result<T, Error> {
25
try {
26
return Result.ok(f());
27
} catch (err) {
28
return Result.error(ErrorUtils.fromUnknown(err));
29
}
30
}
31
32
export async function tryWithAsync<T>(f: () => Promise<T>): Promise<Result<T, Error>> {
33
try {
34
return Result.ok(await f());
35
} catch (err) {
36
return Result.error(ErrorUtils.fromUnknown(err));
37
}
38
}
39
}
40
41
/**
42
* To instantiate a ResultOk, use `Result.ok(value)`.
43
* To instantiate a ResultError, use `Result.error(value)`.
44
*/
45
class ResultOk<T> {
46
constructor(readonly val: T) { }
47
48
map<U>(f: (value: T) => U): ResultOk<U> {
49
return new ResultOk(f(this.val));
50
}
51
52
mapError<E2>(_f: (error: never) => E2): ResultOk<T> {
53
return this;
54
}
55
56
flatMap<U, E2>(f: (value: T) => Result<U, E2>): Result<U, E2> {
57
return f(this.val);
58
}
59
60
/**
61
* Returns the contained ok value.
62
* @throws if this is an error (which is impossible for `ResultOk`,
63
* but provided for use on the `Result<T, E>` union type).
64
*/
65
unwrap(): T {
66
return this.val;
67
}
68
69
/**
70
* Returns the contained ok value, or the provided default if this
71
* is an error.
72
*/
73
unwrapOr(_defaultValue: T): T {
74
return this.val;
75
}
76
77
isOk(): this is ResultOk<T> {
78
return true;
79
}
80
81
isError(): this is ResultError<never> {
82
return false;
83
}
84
}
85
86
/**
87
* To instantiate a ResultOk, use `Result.ok(value)`.
88
* To instantiate a ResultError, use `Result.error(value)`.
89
*/
90
class ResultError<E> {
91
constructor(
92
public readonly err: E,
93
) { }
94
95
map<U>(_f: (value: never) => U): ResultError<E> {
96
return this;
97
}
98
99
mapError<E2>(f: (error: E) => E2): ResultError<E2> {
100
return new ResultError(f(this.err));
101
}
102
103
flatMap<U, E2>(_f: (value: never) => Result<U, E2>): ResultError<E> {
104
return this;
105
}
106
107
/**
108
* Always throws since this is an error result.
109
* @throws The contained error value (wrapped in Error if not already one).
110
*/
111
unwrap(): never {
112
if (this.err instanceof Error) {
113
throw this.err;
114
}
115
throw ErrorUtils.fromUnknown(this.err);
116
}
117
118
/**
119
* Returns the provided default value since this is an error.
120
*/
121
unwrapOr<T>(defaultValue: T): T {
122
return defaultValue;
123
}
124
125
isOk(): this is ResultOk<never> {
126
return false;
127
}
128
129
isError(): this is ResultError<E> {
130
return true;
131
}
132
}
133
134