Skip to content

Commit e27419b

Browse files
authored
Add parseEnum utility function (#91)
1 parent 3fad208 commit e27419b

3 files changed

Lines changed: 96 additions & 47 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- `parseEnum` utility function
13+
1014
## [2.2.0] - 2025-10-02
1115

1216
### Added

src/lib/enum.spec.ts

Lines changed: 78 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,141 @@
1-
import { getEnumNames, getEnumNameFromValue, getEnumValueFromName, getEnumValues } from "./enum";
1+
import { getEnumNames, getEnumNameFromValue, getEnumValueFromName, getEnumValues, parseEnum } from "./enum";
2+
3+
enum TestEnum {
4+
A = 1,
5+
B = 2,
6+
C = 3,
7+
}
8+
9+
enum TestEnumString {
10+
A = "Test3",
11+
B = "Test1",
12+
C = "Test4",
13+
}
214

315
describe("enum tests", () => {
416
test("getEnumNameFromValue/getEnumValueFromName with integer values", () => {
5-
enum TestEnum {
6-
A = 1,
7-
B = 2,
8-
C = 3,
9-
}
10-
11-
const name = getEnumNameFromValue<TestEnum>(TestEnum, TestEnum.B);
17+
const name = getEnumNameFromValue(TestEnum, TestEnum.B);
1218
expect(name).toBe("B");
1319

14-
const value = getEnumValueFromName<TestEnum>(TestEnum, "B");
20+
const value = getEnumValueFromName(TestEnum, "B");
1521
expect(value).toBe(TestEnum.B);
1622
});
1723

1824
test("getEnumValueFromName/getEnumNameFromValue with string values", () => {
19-
enum TestEnum {
20-
A = "Test3",
21-
B = "Test1",
22-
C = "Test4",
23-
}
24-
25-
const name = getEnumNameFromValue<TestEnum>(TestEnum, TestEnum.B);
25+
const name = getEnumNameFromValue(TestEnumString, TestEnumString.B);
2626
expect(name).toBe("B");
2727

28-
const value = getEnumValueFromName<TestEnum>(TestEnum, "B");
29-
expect(value).toBe(TestEnum.B);
28+
const value = getEnumValueFromName(TestEnumString, "B");
29+
expect(value).toBe(TestEnumString.B);
3030
});
3131

3232
test("getEnumNames/getEnumValues with integer values", () => {
33-
enum TestEnum {
34-
A = 1,
35-
B = 2,
36-
C = 3,
37-
}
38-
39-
const names = getEnumNames<TestEnum>(TestEnum);
33+
const names = getEnumNames(TestEnum);
4034
expect(names).toStrictEqual(["A", "B", "C"]);
4135

42-
const values = getEnumValues<TestEnum>(TestEnum);
36+
const values = getEnumValues(TestEnum);
4337
expect(values).toStrictEqual([TestEnum.A, TestEnum.B, TestEnum.C]);
4438
});
4539

4640
test("getEnumNames/getEnumValues with unspecified values", () => {
47-
enum TestEnum {
41+
enum TestEnumUnspecified {
4842
A,
4943
B,
5044
C,
5145
}
52-
const names = getEnumNames<TestEnum>(TestEnum);
46+
const names = getEnumNames(TestEnumUnspecified);
5347
expect(names).toStrictEqual(["A", "B", "C"]);
5448

55-
const values = getEnumValues<TestEnum>(TestEnum);
49+
const values = getEnumValues(TestEnumUnspecified);
5650
expect(values).toStrictEqual([0, 1, 2]);
5751
});
5852

5953
test("getEnumNames/getEnumValues with progressive values", () => {
60-
enum TestEnum {
54+
enum TestEnumProgressive {
6155
A = 10,
6256
B,
6357
C,
6458
}
65-
const names = getEnumNames<TestEnum>(TestEnum);
59+
const names = getEnumNames(TestEnumProgressive);
6660
expect(names).toStrictEqual(["A", "B", "C"]);
6761

68-
const values = getEnumValues<TestEnum>(TestEnum);
62+
const values = getEnumValues(TestEnumProgressive);
6963
expect(values).toStrictEqual([10, 11, 12]);
7064
});
7165

7266
test("getEnumNames/getEnumValues with constants values", () => {
73-
enum TestEnum {
67+
enum TestEnumConstants {
7468
None,
7569
Read = 1 << 1,
7670
Write = 1 << 2,
7771
ReadWrite = Read | Write,
7872
}
7973

80-
const names = getEnumNames<TestEnum>(TestEnum);
74+
const names = getEnumNames(TestEnumConstants);
8175
expect(names).toStrictEqual(["None", "Read", "Write", "ReadWrite"]);
8276

83-
const values = getEnumValues<TestEnum>(TestEnum);
77+
const values = getEnumValues(TestEnumConstants);
8478
expect(values).toStrictEqual([0, 2, 4, 6]);
8579
});
8680

8781
test("getEnumNames/getEnumValues with string values", () => {
88-
enum TestEnum {
89-
A = "Test3",
90-
B = "Test1",
91-
C = "Test4",
92-
}
93-
94-
const names = getEnumNames<TestEnum>(TestEnum);
82+
const names = getEnumNames(TestEnumString);
9583
expect(names).toStrictEqual(["A", "B", "C"]);
9684

97-
const values = getEnumValues<TestEnum>(TestEnum);
98-
expect(values).toStrictEqual([TestEnum.A, TestEnum.B, TestEnum.C]);
85+
const values = getEnumValues(TestEnumString);
86+
expect(values).toStrictEqual([TestEnumString.A, TestEnumString.B, TestEnumString.C]);
9987
});
10088

10189
test("getEnumNames/getEnumValues with empty enum", () => {
102-
enum TestEnum {}
90+
enum TestEnumEmpty {}
10391

104-
const names = getEnumNames<TestEnum>(TestEnum);
92+
const names = getEnumNames(TestEnumEmpty);
10593
expect(names).toStrictEqual([]);
10694

107-
const values = getEnumValues<TestEnum>(TestEnum);
95+
const values = getEnumValues(TestEnumEmpty);
10896
expect(values).toStrictEqual([]);
10997
});
98+
99+
test.each([
100+
// Other types
101+
[null as unknown as string, undefined],
102+
[undefined as unknown as string, undefined],
103+
[0 as unknown as string, undefined],
104+
[2 as unknown as string, TestEnum.B],
105+
[10 as unknown as string, undefined],
106+
[new Date() as unknown as string, undefined],
107+
108+
// Actual strings
109+
["1", TestEnum.A],
110+
["2", TestEnum.B],
111+
["3", TestEnum.C],
112+
["", undefined],
113+
[" ", undefined],
114+
["A", undefined],
115+
["5", undefined],
116+
["test", undefined],
117+
])("parseEnum with integer values", (value, expected) => {
118+
expect(parseEnum(TestEnum, value)).toBe(expected);
119+
});
120+
121+
test.each([
122+
// Other types
123+
[null as unknown as string, undefined],
124+
[undefined as unknown as string, undefined],
125+
[0 as unknown as string, undefined],
126+
[10 as unknown as string, undefined],
127+
[new Date() as unknown as string, undefined],
128+
129+
// Actual strings
130+
["Test3", TestEnumString.A],
131+
["Test1", TestEnumString.B],
132+
["Test4", TestEnumString.C],
133+
["", undefined],
134+
[" ", undefined],
135+
["A", undefined],
136+
["5", undefined],
137+
["test", undefined],
138+
])("parseEnum with string values", (value, expected) => {
139+
expect(parseEnum(TestEnumString, value)).toBe(expected);
140+
});
110141
});

src/lib/enum.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ export function getEnumValues<T>(enumVariable: StandardEnum<T>): T[] {
5858
) as T[];
5959
}
6060

61+
/**
62+
* Parses a string to an enum value
63+
* @param enumVariable The enum for which you want to get the values
64+
* @param value The string to parse
65+
* @returns The enum value corresponding to the string, or undefined if not found
66+
*/
67+
export function parseEnum<T>(enumVariable: StandardEnum<T>, value: string): T | undefined {
68+
if (!isEnumString(enumVariable) && Number.isNaN(Number(value))) {
69+
return undefined;
70+
}
71+
72+
return getEnumValueFromName(enumVariable, getEnumNameFromValue(enumVariable, value as T));
73+
}
74+
6175
/**
6276
* Returns if it's a enum with string value
6377
* @param enumVariable The enum

0 commit comments

Comments
 (0)