Create tagged template for error messages

This commit is contained in:
Koen Vlaswinkel
2023-01-27 11:22:20 +01:00
parent fbe0df59be
commit 4edb83163d
2 changed files with 67 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
export class RedactableErrorMessage {
constructor(
private readonly strings: TemplateStringsArray,
private readonly values: unknown[],
) {}
public toString(): string {
return this.fullMessage;
}
public get fullMessage(): string {
return this.strings
.map((s, i) => s + (this.hasValue(i) ? this.getValue(i) : ""))
.join("");
}
public get redactedMessage(): string {
return this.strings
.map((s, i) => s + (this.hasValue(i) ? "[REDACTED]" : ""))
.join("");
}
private getValue(index: number): unknown {
return this.values[index];
}
private hasValue(index: number): boolean {
return index < this.values.length;
}
}
export function errorMessage(
strings: TemplateStringsArray,
...values: unknown[]
): RedactableErrorMessage {
return new RedactableErrorMessage(strings, values);
}

View File

@@ -0,0 +1,30 @@
import {
errorMessage,
RedactableErrorMessage,
} from "../../../src/common/errors";
describe("errorMessage", () => {
it("creates a RedactableErrorMessage", () => {
expect(errorMessage`Failed to create database ${"foo"}`).toBeInstanceOf(
RedactableErrorMessage,
);
});
it("toString() matches the given message", () => {
expect(errorMessage`Failed to create database ${"foo"}`.toString()).toEqual(
"Failed to create database foo",
);
});
it("fullMessage matches the given message", () => {
expect(
errorMessage`Failed to create database ${"foo"}`.fullMessage,
).toEqual("Failed to create database foo");
});
it("redactedMessage redacts the given message", () => {
expect(
errorMessage`Failed to create database ${"foo"}`.redactedMessage,
).toEqual("Failed to create database [REDACTED]");
});
});