@@ -16,6 +16,10 @@ var _condition2 = _interopRequireDefault(_condition);
1616
1717var _events = require ( 'events' ) ;
1818
19+ var _lodash = require ( 'lodash.clonedeep' ) ;
20+
21+ var _lodash2 = _interopRequireDefault ( _lodash ) ;
22+
1923function _interopRequireDefault ( obj ) { return obj && obj . __esModule ? obj : { default : obj } ; }
2024
2125function _asyncToGenerator ( fn ) { return function ( ) { var gen = fn . apply ( this , arguments ) ; return new Promise ( function ( resolve , reject ) { function step ( key , arg ) { try { var info = gen [ key ] ( arg ) ; var value = info . value ; } catch ( error ) { reject ( error ) ; return ; } if ( info . done ) { resolve ( value ) ; } else { return Promise . resolve ( value ) . then ( function ( value ) { step ( "next" , value ) ; } , function ( err ) { step ( "throw" , err ) ; } ) ; } } return step ( "next" ) ; } ) ; } ; }
@@ -175,7 +179,7 @@ var Rule = function (_EventEmitter) {
175179 /**
176180 * Evaluates the rule, starting with the root boolean operator and recursing down
177181 * All evaluation is done within the context of an almanac
178- * @return {Promise(boolean ) } rule evaluation result
182+ * @return {Promise(RuleResult ) } rule evaluation result
179183 */
180184
181185 } , {
@@ -184,19 +188,27 @@ var Rule = function (_EventEmitter) {
184188 var _ref = _asyncToGenerator ( regeneratorRuntime . mark ( function _callee6 ( almanac ) {
185189 var _this3 = this ;
186190
187- var evaluateCondition , evaluateConditions , prioritizeAndRun , any , all ;
191+ var ruleResult , evaluateCondition , evaluateConditions , prioritizeAndRun , any , all , processResult , result , _result ;
192+
188193 return regeneratorRuntime . wrap ( function _callee6$ ( _context6 ) {
189194 while ( 1 ) {
190195 switch ( _context6 . prev = _context6 . next ) {
191196 case 0 :
197+ ruleResult = {
198+ conditions : ( 0 , _lodash2 . default ) ( this . conditions ) ,
199+ event : ( 0 , _lodash2 . default ) ( this . event ) ,
200+ priority : ( 0 , _lodash2 . default ) ( this . priority )
201+ } ;
202+
192203 /**
193204 * Evaluates the rule conditions
194205 * @param {Condition } condition - condition to evaluate
195206 * @return {Promise(true|false) } - resolves with the result of the condition evaluation
196207 */
208+
197209 evaluateCondition = function ( ) {
198210 var _ref2 = _asyncToGenerator ( regeneratorRuntime . mark ( function _callee ( condition ) {
199- var comparisonValue , passes , subConditions ;
211+ var comparisonValue , passes , subConditions , evaluationResult ;
200212 return regeneratorRuntime . wrap ( function _callee$ ( _context ) {
201213 while ( 1 ) {
202214 switch ( _context . prev = _context . next ) {
@@ -234,7 +246,7 @@ var Rule = function (_EventEmitter) {
234246 case 13 :
235247 // for booleans, rule passing is determined by the all/any result
236248 passes = comparisonValue === true ;
237- _context . next = 29 ;
249+ _context . next = 31 ;
238250 break ;
239251
240252 case 16 :
@@ -243,41 +255,39 @@ var Rule = function (_EventEmitter) {
243255 return condition . evaluate ( almanac , _this3 . engine . operators , comparisonValue ) ;
244256
245257 case 19 :
246- passes = _context . sent ;
247- _context . next = 29 ;
258+ evaluationResult = _context . sent ;
259+
260+ passes = evaluationResult . result ;
261+ condition . factResult = evaluationResult . leftHandSideValue ;
262+ _context . next = 31 ;
248263 break ;
249264
250- case 22 :
251- _context . prev = 22 ;
265+ case 24 :
266+ _context . prev = 24 ;
252267 _context . t0 = _context [ 'catch' ] ( 16 ) ;
253268
254269 if ( ! ( _this3 . engine . allowUndefinedFacts && _context . t0 . code === 'UNDEFINED_FACT' ) ) {
255- _context . next = 28 ;
270+ _context . next = 30 ;
256271 break ;
257272 }
258273
259274 passes = false ;
260- _context . next = 29 ;
275+ _context . next = 31 ;
261276 break ;
262277
263- case 28 :
278+ case 30 :
264279 throw _context . t0 ;
265280
266- case 29 :
267-
268- if ( passes ) {
269- _this3 . emit ( 'success' , _this3 . event , almanac ) ;
270- } else {
271- _this3 . emit ( 'failure' , _this3 . event , almanac ) ;
272- }
281+ case 31 :
282+ condition . result = passes ;
273283 return _context . abrupt ( 'return' , passes ) ;
274284
275- case 31 :
285+ case 33 :
276286 case 'end' :
277287 return _context . stop ( ) ;
278288 }
279289 }
280- } , _callee , _this3 , [ [ 16 , 22 ] ] ) ;
290+ } , _callee , _this3 , [ [ 16 , 24 ] ] ) ;
281291 } ) ) ;
282292
283293 return function evaluateCondition ( _x3 ) {
@@ -453,25 +463,39 @@ var Rule = function (_EventEmitter) {
453463 } ;
454464 } ( ) ;
455465
456- if ( ! this . conditions . any ) {
457- _context6 . next = 11 ;
466+ /**
467+ * Emits based on rule evaluation result, and decorates ruleResult with 'result' property
468+ * @param {Boolean } result
469+ */
470+
471+
472+ processResult = function processResult ( result ) {
473+ ruleResult . result = result ;
474+ if ( result ) _this3 . emit ( 'success' , ruleResult . event , almanac , ruleResult ) ; else _this3 . emit ( 'failure' , ruleResult . event , almanac , ruleResult ) ;
475+ return ruleResult ;
476+ } ;
477+
478+ if ( ! ruleResult . conditions . any ) {
479+ _context6 . next = 14 ;
458480 break ;
459481 }
460482
461- _context6 . next = 8 ;
462- return any ( this . conditions . any ) ;
483+ _context6 . next = 10 ;
484+ return any ( ruleResult . conditions . any ) ;
463485
464- case 8 :
465- return _context6 . abrupt ( 'return' , _context6 . sent ) ;
486+ case 10 :
487+ result = _context6 . sent ;
488+ return _context6 . abrupt ( 'return' , processResult ( result ) ) ;
466489
467- case 11 :
468- _context6 . next = 13 ;
469- return all ( this . conditions . all ) ;
490+ case 14 :
491+ _context6 . next = 16 ;
492+ return all ( ruleResult . conditions . all ) ;
470493
471- case 13 :
472- return _context6 . abrupt ( 'return' , _context6 . sent ) ;
494+ case 16 :
495+ _result = _context6 . sent ;
496+ return _context6 . abrupt ( 'return' , processResult ( _result ) ) ;
473497
474- case 14 :
498+ case 18 :
475499 case 'end' :
476500 return _context6 . stop ( ) ;
477501 }
0 commit comments