/var/www/html/wp-content/plugins/woocommerce/src/Admin/RemoteSpecs/RuleProcessors/RuleEvaluator.php


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 ( 
=== 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;
    }
}