import type {PlainObject} from '../models'; import type {Err, ExtendedErr, Ok, Result} from '../result/models'; import {isNonPlainObject} from './is'; // #region Functions /** * Is the _Result_ an extended error? * * @param result _Result_ to check * @returns `true` if the _Result_ is an extended error, `false` otherwise */ export function isError( result: ExtendedErr | Result, extended: true, ): result is ExtendedErr; /** * Is the _Result_ an error? * * @param result _Result_ to check * @returns `true` if the _Result_ is an error, `false` otherwise */ export function isError(result: Result): result is Err; /** * Is the value an error? * * @param value Value to check * @returns `true` if the value is an error, `false` otherwise */ export function isError(value: unknown): value is Err | ExtendedErr; export function isError( value: unknown, extended?: boolean, ): value is Err | ExtendedErr { return ( isResultValue(value, false) && (extended === true ? (value as ExtendedErr).original instanceof Error : true) ); } /** * Is the _Result_ ok? * * @param value _Result_ to check * @returns `true` if the _Result_ is ok, `false` otherwise */ export function isOk(value: Result): value is Ok; /** * Is the value ok? * * @param value Value to check * @returns `true` if the value is ok, `false` otherwise */ export function isOk(value: unknown): value is Ok; export function isOk(value: unknown): value is Ok { return isResultValue(value, true); } /** * Is the value a _Result_? * * @param value Value to check * @returns `true` if the value is a _Result_, `false` otherwise */ export function isResult(value: unknown): value is ExtendedErr | Result { return isResultValue(value, true) || isResultValue(value, false); } function isResultValue(value: unknown, okValue: boolean): value is Result { if (isNonPlainObject(value)) { return false; } return ( (value as PlainObject).ok === okValue && (okValue ? PROPERTY_VALUE : PROPERTY_ERROR) in value ); } // #endregion // #region Variable const PROPERTY_ERROR = 'error'; const PROPERTY_VALUE = 'value'; // #endregion