"use strict"; const getChain = require("../get-chain"); function testRule(error, rule) { if (typeof rule === "function") { if (rule.prototype != null) { // Constructor function / class return error instanceof rule; } else { // Predicate function return Boolean(rule(error)); } } else if (typeof rule === "object") { for (let [ key, value ] of Object.entries(rule)) { if (error[key] !== value) { return false; } } return true; } else { throw new Error(`Invalid rule type`); } } module.exports = function isErrorType(error, rules) { // FIXME: Use validatem here as well, for rule validation? let chain = getChain(error); return chain.some((causeError) => { if (Array.isArray(rules)) { return rules.every((rule) => testRule(causeError, rule)); } else { return testRule(causeError, rules); } }); };