import { isNull, argumentNotEmptyString, each } from "../safe"; import { ActivationContext } from "./ActivationContext"; import { ServiceMap, Descriptor } from "./interfaces"; import { ActivationError } from "./ActivationError"; export class ReferenceDescriptor implements Descriptor { _name: string _lazy = false _optional = false _default: any _services: ServiceMap constructor(name: string, lazy: boolean, optional: boolean, def, services: ServiceMap) { argumentNotEmptyString(name, "name"); this._name = name; this._lazy = Boolean(lazy); this._optional = Boolean(optional); this._default = def; this._services = services; } activate(context: ActivationContext, name: string) { var me = this; context.enter(name, this, true); // добавляем сервисы if (me._services) { for (var p in me._services) { var sv = me._services[p]; context.register(p, sv); } } if (me._lazy) { // сохраняем контекст активации context = context.clone(); return function (cfg: ServiceMap) { // защищаем контекст на случай исключения в процессе // активации var ct = context.clone(); try { if (cfg) for(let k in cfg) ct.register(k, cfg[v]); return me._optional ? ct.getService(me._name, me._default) : ct .getService(me._name); } catch (error) { throw new ActivationError(me._name, ct.getStack(), error); } }; } var v = me._optional ? context.getService(me._name, me._default) : context.getService(me._name); context.leave(); return v; } isInstanceCreated() { return false; } getInstance() { throw new Error("The reference descriptor doesn't allowed to hold an instance"); } toString() { var opts = []; if (this._optional) opts.push("optional"); if (this._lazy) opts.push("lazy"); var parts = [ "@ref " ]; if (opts.length) { parts.push("{"); parts.push(opts.join()); parts.push("} "); } parts.push(this._name); if (!isNull(this._default)) { parts.push(" = "); parts.push(this._default); } return parts.join(""); } }