1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
<?php /** * Evaluate the given rules as an AND operation - return false early if a * rule evaluates to false. */
namespace Automattic\WooCommerce\Admin\RemoteSpecs\RuleProcessors;
defined( 'ABSPATH' ) || exit;
/** * Evaluate the given rules as an AND operation - return false early if a * rule evaluates to false. */ class RuleEvaluator {
/** * GetRuleProcessor to use. * * @var GetRuleProcessor */ private $get_rule_processor;
/** * Constructor. * * @param GetRuleProcessor $get_rule_processor The GetRuleProcessor to use. */ public function __construct( $get_rule_processor = null ) { $this->get_rule_processor = null === $get_rule_processor ? new GetRuleProcessor() : $get_rule_processor; }
/** * Evaluate the given rules as an AND operation - return false early if a * rule evaluates to false. * * @param array|object $rules The rule or rules being processed. * @param object|null $stored_state Stored state. * @param array $logger_args Arguments for the rule evaluator logger. `slug` is required. * * @throws \InvalidArgumentException Thrown when $logger_args is missing slug. * * @return bool The result of the operation. */ public function evaluate( $rules, $stored_state = null, $logger_args = array() ) {
if ( is_bool( $rules ) ) { return $rules; }
if ( ! is_array( $rules ) ) { $rules = array( $rules ); }
if ( 0 === count( $rules ) ) { return false; }
$evaluation_logger = null;
if ( count( $logger_args ) ) { if ( ! array_key_exists( 'slug', $logger_args ) ) { throw new \InvalidArgumentException( 'Missing required field: slug in $logger_args.' ); }
$source = isset( $logger_args['source'] ) ? $logger_args['source'] : null;
$evaluation_logger = new EvaluationLogger( $logger_args['slug'], $source ); }
foreach ( $rules as $rule ) { if ( ! is_object( $rule ) ) { $evaluation_logger && $evaluation_logger->add_result( 'rule not an object', false ); $evaluation_logger && $evaluation_logger->log();
return false; }
$processor = $this->get_rule_processor->get_processor( $rule->type ); $processor_result = $processor->process( $rule, $stored_state ); $evaluation_logger && $evaluation_logger->add_result( $rule->type, $processor_result );
if ( ! $processor_result ) { $evaluation_logger && $evaluation_logger->log(); return false; } }
$evaluation_logger && $evaluation_logger->log();
return true; } }
|