Skip to content

Commit 101021a

Browse files
committed
Added dedicated method that matches Emmett error by error code not an instance of
1 parent 0bdf5bb commit 101021a

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

src/packages/emmett/src/errors/index.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ export const isErrorConstructor = <ErrorType extends Error>(
1919
};
2020

2121
export class EmmettError extends Error {
22+
public static readonly Codes = {
23+
ValidationError: 400,
24+
IllegalStateError: 403,
25+
NotFoundError: 404,
26+
ConcurrencyError: 412,
27+
InternalServerError: 500,
28+
};
29+
2230
public errorCode: number;
2331

2432
constructor(
@@ -29,7 +37,7 @@ export class EmmettError extends Error {
2937
? options.errorCode
3038
: isNumber(options)
3139
? options
32-
: 500;
40+
: EmmettError.Codes.InternalServerError;
3341
const message =
3442
options && typeof options === 'object' && 'message' in options
3543
? options.message
@@ -57,10 +65,24 @@ export class EmmettError extends Error {
5765
error.errorCode !== undefined &&
5866
error.errorCode !== null
5967
? error.errorCode
60-
: 500,
68+
: EmmettError.Codes.InternalServerError,
6169
message: error.message ?? 'An unknown error occurred',
6270
});
6371
}
72+
73+
public static isInstanceOf<ErrorType extends EmmettError>(
74+
error: unknown,
75+
errorCode: (typeof EmmettError.Codes)[keyof typeof EmmettError.Codes],
76+
): error is ErrorType {
77+
return (
78+
error !== undefined &&
79+
error !== null &&
80+
typeof error === 'object' &&
81+
'errorCode' in error &&
82+
isNumber(error.errorCode) &&
83+
error.errorCode === errorCode
84+
);
85+
}
6486
}
6587

6688
export class ConcurrencyError extends EmmettError {
@@ -70,7 +92,7 @@ export class ConcurrencyError extends EmmettError {
7092
message?: string,
7193
) {
7294
super({
73-
errorCode: 412,
95+
errorCode: EmmettError.Codes.ConcurrencyError,
7496
message:
7597
message ??
7698
`Expected version ${expected.toString()} does not match current ${current?.toString()}`,
@@ -81,10 +103,12 @@ export class ConcurrencyError extends EmmettError {
81103
}
82104
}
83105

106+
// TODO: Make it derive from ConcurrencyError to avoid code duplication
107+
// Or add additional type to distinguinsh both errors
84108
export class ConcurrencyInMemoryDatabaseError extends EmmettError {
85109
constructor(message?: string) {
86110
super({
87-
errorCode: 412,
111+
errorCode: EmmettError.Codes.ConcurrencyError,
88112
message: message ?? `Expected document state does not match current one!`,
89113
});
90114

@@ -96,7 +120,7 @@ export class ConcurrencyInMemoryDatabaseError extends EmmettError {
96120
export class ValidationError extends EmmettError {
97121
constructor(message?: string) {
98122
super({
99-
errorCode: 400,
123+
errorCode: EmmettError.Codes.ValidationError,
100124
message: message ?? `Validation Error ocurred during Emmett processing`,
101125
});
102126

@@ -108,7 +132,7 @@ export class ValidationError extends EmmettError {
108132
export class IllegalStateError extends EmmettError {
109133
constructor(message?: string) {
110134
super({
111-
errorCode: 403,
135+
errorCode: EmmettError.Codes.IllegalStateError,
112136
message: message ?? `Illegal State ocurred during Emmett processing`,
113137
});
114138

@@ -120,7 +144,7 @@ export class IllegalStateError extends EmmettError {
120144
export class NotFoundError extends EmmettError {
121145
constructor(options?: { id: string; type: string; message?: string }) {
122146
super({
123-
errorCode: 404,
147+
errorCode: EmmettError.Codes.NotFoundError,
124148
message:
125149
options?.message ??
126150
(options?.id

0 commit comments

Comments
 (0)