Skip to content

Commit e956f1f

Browse files
committed
use enum-like pattern
1 parent 934545c commit e956f1f

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

src/components/AdrTable.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,27 @@ const formatDate = (date: Date): string | undefined => {
88
}
99
};
1010

11-
const badgeColors = {
12-
Proposed: "primary",
13-
Accepted: "success",
14-
Rejected: "danger",
15-
Deprecated: "warning",
16-
Superseded: "warning",
11+
const AdrStatus = {
12+
Proposed: "Proposed",
13+
Accepted: "Accepted",
14+
Rejected: "Rejected",
15+
Deprecated: "Deprecated",
16+
Superseded: "Superseded",
17+
} as const;
18+
19+
type AdrStatus = (typeof AdrStatus)[keyof typeof AdrStatus];
20+
21+
const badgeColors: Record<AdrStatus, string> = {
22+
[AdrStatus.Proposed]: "primary",
23+
[AdrStatus.Accepted]: "success",
24+
[AdrStatus.Rejected]: "danger",
25+
[AdrStatus.Deprecated]: "warning",
26+
[AdrStatus.Superseded]: "warning",
1727
};
1828

19-
const isBadgeColorKey = (key: string): key is keyof typeof badgeColors => key in badgeColors;
29+
function isAdrStatus(value: unknown): value is AdrStatus {
30+
return typeof value === "string" && value in AdrStatus;
31+
}
2032

2133
interface AdrFrontMatter {
2234
adr: string;
@@ -30,7 +42,7 @@ export default function AdrTable({
3042
frontMatter: AdrFrontMatter;
3143
}): React.JSX.Element {
3244
const { status } = frontMatter;
33-
const badgeColor = status && isBadgeColorKey(status) ? badgeColors[status] : "secondary";
45+
const badgeColor = isAdrStatus(status) ? badgeColors[status] : "secondary";
3446

3547
return (
3648
<table>

0 commit comments

Comments
 (0)