| var prr = require('prr') |
| |
| function init (type, message, cause) { |
| if (!!message && typeof message != 'string') { |
| message = message.message || message.name |
| } |
| prr(this, { |
| type : type |
| , name : type |
| // can be passed just a 'cause' |
| , cause : typeof message != 'string' ? message : cause |
| , message : message |
| }, 'ewr') |
| } |
| |
| // generic prototype, not intended to be actually used - helpful for `instanceof` |
| function CustomError (message, cause) { |
| Error.call(this) |
| if (Error.captureStackTrace) |
| Error.captureStackTrace(this, this.constructor) |
| init.call(this, 'CustomError', message, cause) |
| } |
| |
| CustomError.prototype = new Error() |
| |
| function createError (errno, type, proto) { |
| var err = function (message, cause) { |
| init.call(this, type, message, cause) |
| //TODO: the specificity here is stupid, errno should be available everywhere |
| if (type == 'FilesystemError') { |
| this.code = this.cause.code |
| this.path = this.cause.path |
| this.errno = this.cause.errno |
| this.message = |
| (errno.errno[this.cause.errno] |
| ? errno.errno[this.cause.errno].description |
| : this.cause.message) |
| + (this.cause.path ? ' [' + this.cause.path + ']' : '') |
| } |
| Error.call(this) |
| if (Error.captureStackTrace) |
| Error.captureStackTrace(this, err) |
| } |
| err.prototype = !!proto ? new proto() : new CustomError() |
| return err |
| } |
| |
| module.exports = function (errno) { |
| var ce = function (type, proto) { |
| return createError(errno, type, proto) |
| } |
| return { |
| CustomError : CustomError |
| , FilesystemError : ce('FilesystemError') |
| , createError : ce |
| } |
| } |