import { SimpleAsyncValidateConfig } from "@olagg/validate"; export default class Result { public isSuccess: boolean; public isFailure: boolean; public error?: unknown; private _data?: T; private constructor (isSuccess: boolean, error?: unknown, data?: T) { if (isSuccess && error) { throw new Error(`InvalidOperation: A result cannot be successful and contain an error`); } if (!isSuccess && !error) { throw new Error(`InvalidOperation: A failing result needs to contain an error message`); } this.isSuccess = isSuccess; this.isFailure = !isSuccess; this.error = error; this._data = data; Object.freeze(this); } public data () : T { if (!this.isSuccess || !this._data) { throw new Error("Cant retrieve the data from a failed result."); } return this._data; } public static success (data?: U) : Result { return new Result(true, undefined, data); } public static failure (error: unknown, ...args: unknown[]): Result { let message = error; if (args.length) message = (message as string).concat(" " + args.join(" ") as string); return new Result(false, message); } } SimpleAsyncValidateConfig.onFailure = (error: string) => { return Result.failure(error); };