Completed
Push — master ( 326260...d5155f )
by Sebastian
05:36
created

RuleBuilder::buildCustom()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 9
nc 2
nop 1
dl 0
loc 17
ccs 10
cts 10
cp 1
crap 2
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Linna Filter
5
 *
6
 * @author Sebastian Rapetti <[email protected]>
7
 * @copyright (c) 2018, Sebastian Rapetti
8
 * @license http://opensource.org/licenses/MIT MIT License
9
 */
10
declare(strict_types=1);
11
12
namespace Linna\Filter;
13
14
/**
15
 * Build filter rules from files in rule directory.
16
 */
17
class RuleBuilder
18
{
19
    /**
20
     * Build rules from classes files.
21
     *
22
     * @return array
23
     */
24 91
    public static function build(): array
25
    {
26 91
        $alias = [];
27 91
        $rules = [];
28 91
        $files = glob(__DIR__.'/Rules/*.php', GLOB_ERR);
29
30 91
        foreach ($files as $entry) {
31
            //get file name
32 91
            $class = basename(str_replace('.php', '', $entry));
33 91
            $keyword = strtolower($class);
34
35
            //exclude from rules array because
36
            //custom ruless will be built separately
37 91
            if ($keyword === 'customrule') {
38 91
                continue;
39
            }
40
41
            //get full class name
42 91
            $class = __NAMESPACE__."\Rules\\{$class}";
43
44 91
            self::makeAlias($rules, $alias, $keyword, $class::$config);
0 ignored issues
show
Bug introduced by
The property config does not exist on string.
Loading history...
45
        }
46
47 91
        return [$rules, $alias];
48
    }
49
50
    /**
51
     * Build custom rules passed to Filter with .
52
     *
53
     * @param array $customRules
54
     *
55
     * @return array
56
     */
57 1
    public static function buildCustom(array $customRules): array
58
    {
59 1
        $alias = [];
60 1
        $rules = [];
61
62 1
        foreach ($customRules as $rule) {
63 1
            $instance = $rule->instance;
64
65 1
            $config = $instance->config;
66 1
            $config['instance'] = $instance;
67
68 1
            self::makeAlias($rules, $alias, $config['alias'][0], $config);
69
        }
70
71 1
        unset($customRules);
72
73 1
        return [$rules, $alias];
74
    }
75
76
    /**
77
     * Make alias array for Filter class.
78
     *
79
     * @param array  $rules   Array containing rules
80
     * @param array  $alias   Array containing rule aliases
81
     * @param string $keyword Name of the rule class or rule alias for custom rules
82
     * @param array  $config  Rule configuration
83
     */
84 91
    private static function makeAlias(array &$rules, array &$alias, string $keyword, array $config): void
85
    {
86
        //get config for the rule
87 91
        $rules[$keyword] = $config;
88
        //fill array with alias
89 91
        $keys = $rules[$keyword]['alias'];
90
        //fill array of values with name of the class
91 91
        $values = array_fill(0, count($keys), $keyword);
92
        //combine keys and values
93 91
        $array = array_combine($keys, $values);
94
        //add all to alias array
95 91
        $alias = array_merge($alias, $array);
96
        //free memory
97 91
        unset($rules[$keyword]['alias']);
98 91
    }
99
}
100