- refactor array equality check and add tests - remove OperatingSystem.Unknown causing extra logic, return undefined instead - refactor enum validation to share same logic - refactor scripting language factories to share same logic - refactor too many args in runCodeAsync - refactor ScriptCode constructor to reduce complexity - fix writing useless write to member object since another property write always override it
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import { ScriptingLanguage } from '@/domain/ScriptingLanguage';
|
|
import { IScriptingLanguageFactory } from './IScriptingLanguageFactory';
|
|
import { assertInRange } from '@/application/Common/Enum';
|
|
|
|
type Getter<T> = () => T;
|
|
|
|
export abstract class ScriptingLanguageFactory<T> implements IScriptingLanguageFactory<T> {
|
|
private readonly getters = new Map<ScriptingLanguage, Getter<T>>();
|
|
|
|
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<T>) {
|
|
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);
|
|
}
|
|
|
|
}
|