import { isPromise } from "./promise.helpers"; type TryitReturn = Return extends Promise ? Promise<{ error: Error | null, result: Awaited | null }> : { error: Error | null, result: Return | null }; export function tryit(func: () => Return): TryitReturn { try { const result = func(); if(isPromise(result)){ return result .then((value) => ({ error: null, result: value })) .catch((err) => ({ error: err instanceof Error ? err : new Error(`${err}`), result: null })) as Return extends Promise ? Promise<{error: Error, result: undefined} | {error: undefined, result: Awaited}> : {error: Error, result: undefined} | {error: undefined, result: Return}; } return { error: undefined, result } as TryitReturn; } catch (err) { return { error: err, result: undefined } as TryitReturn; } }