Passed
Push — master ( b13bff...ea2da2 )
by tsugumu
01:57
created

Normalizer::getDefaultPipelineBuilder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 9
nc 2
nop 0
dl 0
loc 15
rs 9.9666
c 0
b 0
f 0
1
<?php
2
namespace TKuni\PhpNormalizer;
3
4
5
use TKuni\PhpNormalizer\Contracts\PipelineBuilderContract;
6
use TKuni\PhpNormalizer\Filters\CamelToSnakeFilter;
7
use TKuni\PhpNormalizer\Filters\EmptyToNullFilter;
8
use TKuni\PhpNormalizer\Filters\IntegerFilter;
9
use TKuni\PhpNormalizer\Filters\TrimFilter;
10
use TKuni\PhpNormalizer\Helper\DotChainOperator;
11
12
class Normalizer
13
{
14
    /**
15
     * @var array
16
     */
17
    private $rules;
18
19
    /**
20
     * @var array
21
     */
22
    private $pipelines = [];
23
24
    public function __construct(array $rules, PipelineBuilderContract $pipelineBuilder = null)
25
    {
26
        $this->rules = $rules;
27
28
        if ($pipelineBuilder === null) {
29
            $pipelineBuilder = $this->getDefaultPipelineBuilder();
30
        }
31
32
        foreach ($rules as $propName => $filterNames) {
33
            $this->pipelines[$propName] = $pipelineBuilder->make($filterNames);
34
        }
35
    }
36
37
    public function normalize(array $in) {
38
        $out = $in;
39
40
        foreach ($this->pipelines as $propName => $pipeline) {
41
            $out = DotChainOperator::update($out, $propName, function ($in) use ($pipeline) {
42
                return $pipeline->apply($in);
43
            });
44
        }
45
46
        return $out;
47
    }
48
49
    private function getDefaultPipelineBuilder() {
50
        $classes = [
51
            TrimFilter::class,
52
            EmptyToNullFilter::class,
53
            CamelToSnakeFilter::class,
54
            IntegerFilter::class,
55
        ];
56
57
        $factory = new PipelineBuilder();
58
59
        foreach ($classes as $class) {
60
            $factory->registerFilter(new $class());
61
        }
62
63
        return $factory;
64
    }
65
}