diff options
Diffstat (limited to 'src/shared/settings/Settings.ts')
-rw-r--r-- | src/shared/settings/Settings.ts | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/src/shared/settings/Settings.ts b/src/shared/settings/Settings.ts index 2c9e37f..add5389 100644 --- a/src/shared/settings/Settings.ts +++ b/src/shared/settings/Settings.ts @@ -1,13 +1,16 @@ +import Ajv from 'ajv'; + import Keymaps, { KeymapsJSON } from './Keymaps'; import Search, { SearchJSON } from './Search'; import Properties, { PropertiesJSON } from './Properties'; import Blacklist, { BlacklistJSON } from './Blacklist'; +import validate from './validate'; export type SettingsJSON = { - keymaps: KeymapsJSON, - search: SearchJSON, - properties: PropertiesJSON, - blacklist: BlacklistJSON, + keymaps?: KeymapsJSON, + search?: SearchJSON, + properties?: PropertiesJSON, + blacklist?: BlacklistJSON, }; export default class Settings { @@ -36,25 +39,30 @@ export default class Settings { this.blacklist = blacklist; } - static fromJSON(json: any): Settings { - let settings = { ...DefaultSetting }; - for (let key of Object.keys(json)) { - switch (key) { - case 'keymaps': - settings.keymaps = Keymaps.fromJSON(json.keymaps); - break; - case 'search': - settings.search = Search.fromJSON(json.search); - break; - case 'properties': - settings.properties = Properties.fromJSON(json.properties); - break; - case 'blacklist': - settings.blacklist = Blacklist.fromJSON(json.blacklist); - break; - default: - throw new TypeError('unknown setting: ' + key); - } + static fromJSON(json: unknown): Settings { + const valid = validate(json); + if (!valid) { + const message = (validate as any).errors!! + .map((err: Ajv.ErrorObject) => { + return `'${err.dataPath}' ${err.message}`; + }) + .join('; '); + throw new TypeError(message); + } + + const obj = json as SettingsJSON; + const settings = { ...DefaultSetting }; + if (obj.keymaps) { + settings.keymaps = Keymaps.fromJSON(obj.keymaps); + } + if (obj.search) { + settings.search = Search.fromJSON(obj.search); + } + if (obj.properties) { + settings.properties = Properties.fromJSON(obj.properties); + } + if (obj.blacklist) { + settings.blacklist = Blacklist.fromJSON(obj.blacklist); } return new Settings(settings); } |