index.js
2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Stores and formats error information.
*
* let err = new Howhap(
* {
* message: 'This is wrong: {{ what }}',
* status: 400
* },
* {
* what: 'me'
* }
* );
* res.status(err.status()).json(err.toJSON());
* res.render('error-page', { error: err.toJSON() });
*/
let Hogan = require('hogan.js');
class Howhap {
constructor(messageStatus, constructorParams) {
if(Object.prototype.toString.call(messageStatus) !== '[object Object]') {
throw new Error('First argument to Howhap constructor must be an object.');
}
if(!messageStatus.hasOwnProperty('message')) {
throw new Error('First argument to Howhap constructor must contain a message property.');
}
if(!messageStatus.hasOwnProperty('status')) {
throw new Error('First argument to Howhap constructor must contain a status property.');
}
if(constructorParams === undefined || constructorParams === null) {
if(messageStatus.hasOwnProperty('params')) {
constructorParams = messageStatus.params;
}
else {
constructorParams = {};
}
}
this._message = null;
this._status = null;
this._params = null;
this._template = null;
this.message = messageStatus.message;
this.status = messageStatus.status;
this.params = constructorParams;
this.name = 'Howhap';
}
toString() {
return this._template.render(this._params);
}
toJSON() {
let newParams = {};
for(let i in this._params) {
newParams[i] = ''+this._params[i];
}
return {
message: this._message,
status: this._status,
params: newParams
};
}
set(obj) {
if(obj.hasOwnProperty('message')) {
this.message = obj.message;
}
if(obj.hasOwnProperty('status')) {
this.status = obj.status;
}
if(obj.hasOwnProperty('params')) {
this.params = obj.params;
}
}
get message() {
return this._message;
}
set message(val) {
if(typeof val !== 'string' && !(val instanceof String)) {
throw new Error('Message property must be a string.');
}
this._message = val;
this._template = Hogan.compile(this._message);
}
get status() {
return this._status;
}
set status(val) {
let tmp = parseInt(val);
if(tmp != val || isNaN(tmp)) {
throw new Error('Status property must be an integer.');
}
this._status = tmp;
}
get params() {
return this._params;
}
set params(val) {
if(val === undefined || val === null) {
val = {};
}
if(Object.prototype.toString.call(val) !== '[object Object]') {
throw new Error('Params property must be an object.');
}
this._params = val;
}
}
Howhap.prototype.prototype = new Error();
module.exports = Howhap;