58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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
 | |
|   }
 | |
| }
 |