2021-12-03 17:58:48 +01:00

65 lines
1.7 KiB
JavaScript

'use strict';
// core modules
var util = require('util');
// external modules
var _ = require('lodash');
var assert = require('assert-plus');
// local files
var RestError = require('./baseClasses/RestError');
/**
* create RestError subclasses for users. takes a string, creates a
* constructor for them. magicks, again.
* @public
* @function makeConstructor
* @param {String} name the name of the error class to create
* @param {Number} defaults optional status code
* @return {Function} a constructor function
*/
function makeConstructor(name, defaults) {
assert.string(name, 'name');
assert.optionalObject(defaults, 'defaults');
// code property doesn't have 'Error' in it. remove it.
var defaultCode = name.replace(new RegExp('[Ee]rror$'), '');
var prototypeDefaults = _.assign({}, {
name: name,
code: (defaults && defaults.code) || defaultCode,
restCode: _.get(defaults, 'restCode', defaultCode)
}, defaults);
// assert that this constructor doesn't already exist.
assert.equal(
typeof module.exports[name],
'undefined',
'Constructor already exists!'
);
// dynamically create a constructor.
// must be anonymous fn.
var ErrCtor = function() { // eslint-disable-line require-jsdoc, func-style
// call super
RestError.apply(this, arguments);
this.name = name;
};
util.inherits(ErrCtor, RestError);
// copy over all options to prototype
_.assign(ErrCtor.prototype, prototypeDefaults);
// assign display name
ErrCtor.displayName = name;
// return constructor to user, they can choose how to store and manage it.
return ErrCtor;
}
module.exports = makeConstructor;