r37r0m0d3l/of

View on GitHub
src/core/ofSync.js

Summary

Maintainability
A
55 mins
Test Coverage
import { ERR_UNKNOWN } from "../const/error.js";

import { isFunction } from "../util/isFunction.js";

/**
 * @name ofSync
 * @param {Function} callable
 * @param {[]=} args
 * @param {*=} defaultResult
 * @param {*=} overrideError
 * @returns {[*, unknown] | [undefined, *]}
 */
export function ofSync(callable, args, defaultResult, overrideError) {
  if (!isFunction(callable)) {
    return [undefined, new Error(ERR_UNKNOWN)];
  }
  try {
    return [callable(...(Array.isArray(args) ? [...args] : [])), undefined];
  } catch (caughtFunctionError) {
    let caughtError;
    if (overrideError instanceof Error) {
      caughtError = overrideError;
    } else if (typeof overrideError === "string") {
      caughtFunctionError.message = overrideError;
      caughtError = caughtFunctionError;
    } else if (caughtFunctionError === undefined || caughtFunctionError === null) {
      caughtError = new Error(ERR_UNKNOWN);
    } else {
      caughtError = caughtFunctionError;
    }
    return [defaultResult, caughtError];
  }
}