Path: blob/main/extensions/copilot/src/util/common/result.ts
13397 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { ErrorUtils } from './errors';67export type Result<T, E> = ResultOk<T> | ResultError<E>;89export namespace Result {1011export function ok<T>(value: T): ResultOk<T> {12return new ResultOk(value);13}1415export function error<E>(value: E): ResultError<E> {16return new ResultError(value);17}1819export function fromString(errorMessage: string): ResultError<Error> {20return Result.error(new Error(errorMessage));21}2223export function tryWith<T>(f: () => T): Result<T, Error> {24try {25return Result.ok(f());26} catch (err) {27return Result.error(ErrorUtils.fromUnknown(err));28}29}3031export async function tryWithAsync<T>(f: () => Promise<T>): Promise<Result<T, Error>> {32try {33return Result.ok(await f());34} catch (err) {35return Result.error(ErrorUtils.fromUnknown(err));36}37}38}3940/**41* To instantiate a ResultOk, use `Result.ok(value)`.42* To instantiate a ResultError, use `Result.error(value)`.43*/44class ResultOk<T> {45constructor(readonly val: T) { }4647map<U>(f: (value: T) => U): ResultOk<U> {48return new ResultOk(f(this.val));49}5051mapError<E2>(_f: (error: never) => E2): ResultOk<T> {52return this;53}5455flatMap<U, E2>(f: (value: T) => Result<U, E2>): Result<U, E2> {56return f(this.val);57}5859/**60* Returns the contained ok value.61* @throws if this is an error (which is impossible for `ResultOk`,62* but provided for use on the `Result<T, E>` union type).63*/64unwrap(): T {65return this.val;66}6768/**69* Returns the contained ok value, or the provided default if this70* is an error.71*/72unwrapOr(_defaultValue: T): T {73return this.val;74}7576isOk(): this is ResultOk<T> {77return true;78}7980isError(): this is ResultError<never> {81return false;82}83}8485/**86* To instantiate a ResultOk, use `Result.ok(value)`.87* To instantiate a ResultError, use `Result.error(value)`.88*/89class ResultError<E> {90constructor(91public readonly err: E,92) { }9394map<U>(_f: (value: never) => U): ResultError<E> {95return this;96}9798mapError<E2>(f: (error: E) => E2): ResultError<E2> {99return new ResultError(f(this.err));100}101102flatMap<U, E2>(_f: (value: never) => Result<U, E2>): ResultError<E> {103return this;104}105106/**107* Always throws since this is an error result.108* @throws The contained error value (wrapped in Error if not already one).109*/110unwrap(): never {111if (this.err instanceof Error) {112throw this.err;113}114throw ErrorUtils.fromUnknown(this.err);115}116117/**118* Returns the provided default value since this is an error.119*/120unwrapOr<T>(defaultValue: T): T {121return defaultValue;122}123124isOk(): this is ResultOk<never> {125return false;126}127128isError(): this is ResultError<E> {129return true;130}131}132133134