Skip to content

Commit dd2b9c7

Browse files
authored
Add numberSelector utility (#1126)
1 parent 2df620b commit dd2b9c7

File tree

7 files changed

+65
-5
lines changed

7 files changed

+65
-5
lines changed

.changeset/forty-stingrays-lay.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/util-config-provider": minor
3+
---
4+
5+
Add numberSelector utility

packages/util-config-provider/src/booleanSelector.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { booleanSelector, SelectorType } from "./booleanSelector";
1+
import { booleanSelector } from "./booleanSelector";
2+
import { SelectorType } from "./types";
23

34
describe(booleanSelector.name, () => {
45
const key = "key";

packages/util-config-provider/src/booleanSelector.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
export enum SelectorType {
2-
ENV = "env",
3-
CONFIG = "shared config entry",
4-
}
1+
import { SelectorType } from "./types";
52

63
/**
74
* Returns boolean value true/false for string value "true"/"false",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export * from "./booleanSelector";
2+
export * from "./numberSelector";
3+
export * from "./types";
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { numberSelector } from "./numberSelector";
2+
import { SelectorType } from "./types";
3+
4+
describe(numberSelector.name, () => {
5+
const key = "key";
6+
const obj: { [key]: any } = {} as any;
7+
8+
describe.each(Object.entries(SelectorType))(`Selector %s`, (selectorKey, selectorValue) => {
9+
beforeEach(() => {
10+
delete obj[key];
11+
});
12+
13+
it(`should return undefined if ${key} is not defined`, () => {
14+
expect(numberSelector(obj, key, SelectorType[selectorKey])).toBeUndefined();
15+
});
16+
17+
it.each([
18+
[0, "0"],
19+
[1, "1"],
20+
])(`should return number %s if ${key}="%s"`, (output, input) => {
21+
obj[key] = input;
22+
expect(numberSelector(obj, key, SelectorType[selectorKey])).toBe(output);
23+
});
24+
25+
it.each(["yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => {
26+
obj[key] = input;
27+
expect(() => numberSelector(obj, key, SelectorType[selectorKey])).toThrow(
28+
new TypeError(`Cannot load ${selectorValue} '${key}'. Expected number, got '${obj[key]}'.`)
29+
);
30+
});
31+
});
32+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { SelectorType } from "./types";
2+
3+
/**
4+
* Returns number value for string value, if the string is defined in obj[key].
5+
* Returns undefined, if obj[key] is not defined.
6+
* Throws error for all other cases.
7+
*
8+
* @internal
9+
*/
10+
export const numberSelector = (obj: Record<string, string | undefined>, key: string, type: SelectorType) => {
11+
if (!(key in obj)) return undefined;
12+
13+
const numberValue = parseInt(obj[key] as string, 10);
14+
if (Number.isNaN(numberValue)) {
15+
throw new TypeError(`Cannot load ${type} '${key}'. Expected number, got '${obj[key]}'.`);
16+
}
17+
18+
return numberValue;
19+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum SelectorType {
2+
ENV = "env",
3+
CONFIG = "shared config entry",
4+
}

0 commit comments

Comments
 (0)