import { ScriptingLanguage } from '@/domain/ScriptingLanguage'; import { IScriptingLanguageFactory } from './IScriptingLanguageFactory'; import { assertInRange } from '@/application/Common/Enum'; type Getter = () => T; export abstract class ScriptingLanguageFactory implements IScriptingLanguageFactory { private readonly getters = new Map>(); public create(language: ScriptingLanguage): T { assertInRange(language, ScriptingLanguage); if (!this.getters.has(language)) { throw new RangeError(`unknown language: "${ScriptingLanguage[language]}"`); } const getter = this.getters.get(language); const instance = getter(); return instance; } protected registerGetter(language: ScriptingLanguage, getter: Getter) { assertInRange(language, ScriptingLanguage); if (!getter) { throw new Error('undefined getter'); } if (this.getters.has(language)) { throw new Error(`${ScriptingLanguage[language]} is already registered`); } this.getters.set(language, getter); } }