Passed
Push — master ( 5182b2...62e99b )
by Valentas
50s queued 11s
created

NormalizationContext::areNullValuesRemoved()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Paysera\Component\Normalization;
5
6
class NormalizationContext
7
{
8
    private $coreNormalizer;
9
    private $defaultFieldsIncluded;
10
    private $includedFields;
11
    private $path;
12
    private $normalizationGroup;
13
    private $nullValuesRemoved;
14
15 10
    public function __construct(
16
        CoreNormalizer $coreNormalizer,
17
        array $includedFields = [],
18
        string $normalizationGroup = null
19
    ) {
20 10
        $this->coreNormalizer = $coreNormalizer;
21 10
        $this->setIncludedFields($includedFields);
22 10
        $this->normalizationGroup = $normalizationGroup;
23 10
        $this->path = [];
24 10
        $this->nullValuesRemoved = false;
25 10
    }
26
27 10
    private function setIncludedFields(array $includedFields, bool $defaultFieldsIncluded = false)
28
    {
29 10
        $this->defaultFieldsIncluded = (
30 10
            $defaultFieldsIncluded
31 10
            || count($includedFields) === 0
32 1
            || in_array('*', $includedFields, true)
33
        );
34 10
        $this->includedFields = $includedFields;
35 10
    }
36
37
    public function getPath(): array
38
    {
39
        return $this->path;
40
    }
41
42
    /**
43
     * @return string|null
44
     */
45 3
    public function getNormalizationGroup()
46
    {
47 3
        return $this->normalizationGroup;
48
    }
49
50 2
    public function normalize($data, string $fieldName, string $type = null)
51
    {
52 2
        if (!$this->isFieldIncluded($fieldName) && !$this->isArrayItem($fieldName)) {
53
            return null;
54
        }
55
56 2
        return $this->coreNormalizer->normalize($data, $type, $this->createScopedContext($fieldName));
57
    }
58
59 7
    public function createScopedContext(string $fieldName): self
60
    {
61 7
        $context = clone $this;
62 7
        $context->nullValuesRemoved = false;
63
64 7
        if ($this->isArrayItem($fieldName)) {
65 2
            return $context;
66
        }
67
68 7
        $includedFields = [];
69 7
        $keyPrefix = $fieldName . '.';
70 7
        $keyLength = strlen($keyPrefix);
71 7
        foreach ($this->includedFields as $fieldPattern) {
72 1
            if (substr($fieldPattern, 0, $keyLength) === $keyPrefix) {
73 1
                $includedFields[] = substr($fieldPattern, $keyLength);
74
            }
75
        }
76
77 7
        $context->setIncludedFields($includedFields, $this->defaultFieldsIncluded);
78 7
        $context->path[] = $fieldName;
79
80 7
        return $context;
81
    }
82
83 2
    public function isFieldExplicitlyIncluded(string $fieldName): bool
84
    {
85 2
        return in_array($fieldName, $this->includedFields, true);
86
    }
87
88 7
    public function isFieldIncluded(string $fieldName): bool
89
    {
90 7
        return $this->defaultFieldsIncluded || in_array($fieldName, $this->includedFields, true);
91
    }
92
93 7
    private function isArrayItem(string $fieldName)
94
    {
95 7
        return $fieldName === '';
96
    }
97
98 1
    public function markNullValuesForRemoval()
99
    {
100 1
        $this->nullValuesRemoved = true;
101 1
    }
102
103 7
    public function areNullValuesRemoved(): bool
104
    {
105 7
        return $this->nullValuesRemoved;
106
    }
107
}
108