From 31585800a4f320a76731f92259b3112e9518be1f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 17 Jun 2020 17:15:31 +0200 Subject: [PATCH] packages/config: added must* variant for reading required primitive values --- packages/config/src/reader.test.ts | 25 +++++++++++++++++++++++ packages/config/src/reader.ts | 32 ++++++++++++++++++++++++++++++ packages/config/src/types.ts | 4 ++++ 3 files changed, 61 insertions(+) diff --git a/packages/config/src/reader.test.ts b/packages/config/src/reader.test.ts index 3d3287dfe7..e33939bb4b 100644 --- a/packages/config/src/reader.test.ts +++ b/packages/config/src/reader.test.ts @@ -49,6 +49,10 @@ function expectValidValues(config: ConfigReader) { 'string1', 'string2', ]); + expect(config.mustNumber('zero')).toBe(0); + expect(config.mustBoolean('true')).toBe(true); + expect(config.mustString('string')).toBe('string'); + expect(config.mustStringArray('strings')).toEqual(['string1', 'string2']); const [config1, config2, config3] = config.getConfigArray('nestlings'); expect(config1.getBoolean('boolean')).toBe(true); @@ -57,6 +61,9 @@ function expectValidValues(config: ConfigReader) { } function expectInvalidValues(config: ConfigReader) { + expect(() => config.getBoolean('string')).toThrow( + 'Invalid type in config for key string, got string, wanted boolean', + ); expect(() => config.getNumber('string')).toThrow( 'Invalid type in config for key string, got string, wanted number', ); @@ -87,6 +94,18 @@ function expectInvalidValues(config: ConfigReader) { expect(() => config.getConfigArray('one')).toThrow( 'Invalid type in config for key one, got number, wanted object-array', ); + expect(() => config.mustBoolean('missing')).toThrow( + "Missing required config value at 'missing'", + ); + expect(() => config.mustNumber('missing')).toThrow( + "Missing required config value at 'missing'", + ); + expect(() => config.mustString('missing')).toThrow( + "Missing required config value at 'missing'", + ); + expect(() => config.mustStringArray('missing')).toThrow( + "Missing required config value at 'missing'", + ); } describe('ConfigReader', () => { @@ -210,6 +229,12 @@ describe('ConfigReader with fallback', () => { // Config arrays aren't merged either expect(config.getConfigArray('merged.configs').length).toBe(1); expect(config.getConfigArray('merged.configs')[0].getString('a')).toBe('a'); + expect(config.getConfigArray('merged.configs')[0].mustString('a')).toBe( + 'a', + ); + expect(() => + config.getConfigArray('merged.configs')[0].mustString('missing'), + ).toThrow("Missing required config value at 'missing'"); expect( config.getConfigArray('merged.configs')[0].getString('b'), ).toBeUndefined(); diff --git a/packages/config/src/reader.ts b/packages/config/src/reader.ts index 95c4f47383..7878a392ff 100644 --- a/packages/config/src/reader.ts +++ b/packages/config/src/reader.ts @@ -92,6 +92,14 @@ export class ConfigReader implements Config { return (configs ?? []).map(obj => new ConfigReader(obj)); } + mustNumber(key: string): number { + const value = this.getNumber(key); + if (value === undefined) { + throw new Error(`Missing required config value at '${key}'`); + } + return value; + } + getNumber(key: string): number | undefined { return this.readConfigValue( key, @@ -99,6 +107,14 @@ export class ConfigReader implements Config { ); } + mustBoolean(key: string): boolean { + const value = this.getBoolean(key); + if (value === undefined) { + throw new Error(`Missing required config value at '${key}'`); + } + return value; + } + getBoolean(key: string): boolean | undefined { return this.readConfigValue( key, @@ -106,6 +122,14 @@ export class ConfigReader implements Config { ); } + mustString(key: string): string { + const value = this.getString(key); + if (value === undefined) { + throw new Error(`Missing required config value at '${key}'`); + } + return value; + } + getString(key: string): string | undefined { return this.readConfigValue( key, @@ -114,6 +138,14 @@ export class ConfigReader implements Config { ); } + mustStringArray(key: string): string[] { + const value = this.getStringArray(key); + if (value === undefined) { + throw new Error(`Missing required config value at '${key}'`); + } + return value; + } + getStringArray(key: string): string[] | undefined { return this.readConfigValue(key, values => { if (!Array.isArray(values)) { diff --git a/packages/config/src/types.ts b/packages/config/src/types.ts index 9eda6c8b32..73b8e42130 100644 --- a/packages/config/src/types.ts +++ b/packages/config/src/types.ts @@ -32,10 +32,14 @@ export type Config = { getConfigArray(key: string): Config[]; getNumber(key: string): number | undefined; + mustNumber(key: string): number; getBoolean(key: string): boolean | undefined; + mustBoolean(key: string): boolean; getString(key: string): string | undefined; + mustString(key: string): string; getStringArray(key: string): string[] | undefined; + mustStringArray(key: string): string[]; };