export async function tryDo(promise: Promise) : Promise> { try { return {ok: true, result: await promise}; } catch(err) { return {ok: false, error: err}; } } export async function assertOk(promise: Promise): Promise { try { return await promise; } catch (err) { if (hasStackTrace(err)) { const trace: {stack?: string} = {}; Error.captureStackTrace(trace); err.stack = `${err.stack}\nCaused by: ${trace.stack}`; } throw err; } } export function hasStackTrace(reason: any): reason is {stack: unknown} { return reason && Object.prototype.hasOwnProperty.call(reason, "stack"); } export function isHttpError(err: any): err is T { return err && Object.prototype.hasOwnProperty.call(err, "response"); } export type Ok = T & { ok: true }; export type Error = T & { ok: false }; export type Option = Ok | Error;