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

Normalizer   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 22
dl 0
loc 52
rs 10
c 1
b 0
f 1
wmc 7

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 3
A normalize() 0 10 2
A getDefaultPipelineBuilder() 0 15 2
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
}