import { Container } from "../Container"; import { argumentNotNull, each } from "../../safe"; import { DescriptorBuilder } from "./DescriptorBuilder"; enum State { ready, pending } export class Configuration { private _state = State.ready; _completion: PromiseLike = Promise.resolve(); _builders: { [k in keyof S]?: (service: DescriptorBuilder) => void } = {}; register(name: K, builder: (service: DescriptorBuilder) => void): Configuration> { argumentNotNull(builder, "builder"); return this; } private _moveStart() { if (this._state !== State.ready) throw new Error("Invalid operation"); this._state = State.pending; } private _moveDone() { this._state = State.ready; } apply(target: Container) { this._moveStart(); let pending = 1; this._completion = new Promise((resolve, reject) => { each(this._builders, (v, k) => { pending++; const d = new DescriptorBuilder(target, result => { target.register(k, result); if (!--pending) resolve(); }); try { v(d); } catch (e) { reject(e); } }); }).then(() => this._moveDone()); } }