import { ContextKeyExpr, ContextKeyExpression } from './contextkey/contextkey'; export default class WhenClause { private expression_:string; private validate_:boolean; private rules_:ContextKeyExpression = null; constructor(expression:string, validate:boolean) { this.expression_ = expression; this.validate_ = validate; } private createContext(ctx: any) { return { getValue: (key: string) => { return ctx[key]; }, }; } private get rules():ContextKeyExpression { if (!this.rules_) { this.rules_ = ContextKeyExpr.deserialize(this.expression_); } return this.rules_; } public evaluate(context:any):boolean { if (this.validate_) this.validate(context); return this.rules.evaluate(this.createContext(context)); } public validate(context:any) { const keys = this.rules.keys(); for (const key of keys) { if (!(key in context)) throw new Error(`No such key: ${key}`); } } }