import {isOk, isResult} from '../internal/result'; import type {AnyResult, Err, ExtendedErr, Ok, Result} from './models'; // #region Functions /** * Creates an extended error result * * @param value Error value * @param original Original error * @returns Error result */ export function error(value: E, original: Error): ExtendedErr; /** * Creates an error result * * @param value Error value * @returns Error result */ export function error(value: E): Err; export function error(value: E, original?: Error): Err | ExtendedErr { return getError(value, original); } export function getError(value: E, original?: Error): Err | ExtendedErr { const errorResult: Err | ExtendedErr = { error: value, ok: false, }; if (original instanceof Error) { (errorResult as ExtendedErr).original = original; } return errorResult; } /** * Creates an ok result * * @param value Value * @returns Ok result */ export function ok(value: Value): Ok { return { ok: true, value, }; } /** * Converts a result to a _Promise_ * * Resolves if ok, rejects for error * * @param callback Callback to get the result * @returns Promised result */ export async function toPromise( callback: () => AnyResult, ): Promise; /** * Converts a result to a _Promise_ * * Resolves if ok, rejects for error * * @param result _Result_ to convert * @returns Promised result */ export async function toPromise(result: AnyResult): Promise; /** * Converts a _Result_ to a _Promise_ * * Resolves if ok, rejects for error * * @param result _Result_ to convert * @returns Promised result */ export async function toPromise( result: AnyResult | (() => AnyResult), ): Promise { const actual = typeof result === 'function' ? result() : result; if (!isResult(actual)) { return Promise.reject(new Error(MESSAGE_PROMISE_RESULT)); } return isOk(actual) ? Promise.resolve(actual.value) : Promise.reject(actual.error); } /** * Gets the value of an ok result _(or a default value)_ * * @param value _Result_ to unwrap * @param defaultValue Default value * @returns Value of the _Result_ _(or the default value)_ */ export function unwrap(value: Result, defaultValue: Value): Value; /** * Gets the value of an ok result _(or a default value)_ * * @param value _Result_ to unwrap * @param defaultValue Default value * @returns Value of the _Result_ _(or the default value)_ */ export function unwrap(value: unknown, defaultValue: unknown): unknown; export function unwrap(value: unknown, defaultValue: unknown): unknown { return isOk(value) ? value.value : defaultValue; } // #endregion // #region Variables const MESSAGE_PROMISE_RESULT = 'toPromise expected to receive a Result'; // #endregion // #region Exports export {isError, isOk, isResult} from '../internal/result'; // #endregion