• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var prr = require('prr')
2
3function init (type, message, cause) {
4  if (!!message && typeof message != 'string') {
5    message = message.message || message.name
6  }
7  prr(this, {
8      type    : type
9    , name    : type
10      // can be passed just a 'cause'
11    , cause   : typeof message != 'string' ? message : cause
12    , message : message
13  }, 'ewr')
14}
15
16// generic prototype, not intended to be actually used - helpful for `instanceof`
17function CustomError (message, cause) {
18  Error.call(this)
19  if (Error.captureStackTrace)
20    Error.captureStackTrace(this, this.constructor)
21  init.call(this, 'CustomError', message, cause)
22}
23
24CustomError.prototype = new Error()
25
26function createError (errno, type, proto) {
27  var err = function (message, cause) {
28    init.call(this, type, message, cause)
29    //TODO: the specificity here is stupid, errno should be available everywhere
30    if (type == 'FilesystemError') {
31      this.code    = this.cause.code
32      this.path    = this.cause.path
33      this.errno   = this.cause.errno
34      this.message =
35        (errno.errno[this.cause.errno]
36          ? errno.errno[this.cause.errno].description
37          : this.cause.message)
38        + (this.cause.path ? ' [' + this.cause.path + ']' : '')
39    }
40    Error.call(this)
41    if (Error.captureStackTrace)
42      Error.captureStackTrace(this, err)
43  }
44  err.prototype = !!proto ? new proto() : new CustomError()
45  return err
46}
47
48module.exports = function (errno) {
49  var ce = function (type, proto) {
50    return createError(errno, type, proto)
51  }
52  return {
53      CustomError     : CustomError
54    , FilesystemError : ce('FilesystemError')
55    , createError     : ce
56  }
57}
58