MapMapper::slumber()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 13
c 0
b 0
f 0
rs 10
ccs 7
cts 7
cp 1
cc 3
nc 3
nop 2
crap 3
1
<?php
2
/**
3
 * File was created 30.09.2015 07:46
4
 */
5
6
namespace PeekAndPoke\Component\Slumber\Core\Codec\Property;
7
8
use PeekAndPoke\Component\Collections\Collection;
9
use PeekAndPoke\Component\Slumber\Annotation\Slumber\AsMap;
10
use PeekAndPoke\Component\Slumber\Core\Codec\Awaker;
11
use PeekAndPoke\Component\Slumber\Core\Codec\Mapper;
12
use PeekAndPoke\Component\Slumber\Core\Codec\Slumberer;
13
14
/**
15
 * @method AsMap getOptions()
16
 *
17
 * @author Karsten J. Gerber <[email protected]>
18
 */
19
class MapMapper extends AbstractCollectionMapper
20
{
21
    /**
22
     * @param Slumberer          $slumberer
23
     * @param array|\Traversable $value
24
     *
25
     * @return null|\stdClass We return a std class as this will ensure json-encode will create something like {"0":1}
26
     */
27 17
    public function slumber(Slumberer $slumberer, $value)
28
    {
29 17
        if (false === $this->isIterable($value)) {
30 8
            return null;
31
        }
32
33 9
        $nested = $this->nested;
34
35 9
        if ($nested->getOptions()->keepNullValuesInCollections()) {
36 9
            return $this->slumberKeepNulls($slumberer, $value, $nested);
37
        }
38
39 3
        return $this->slumberFilterNulls($slumberer, $value, $nested);
40
    }
41
42
    /**
43
     * @param Awaker             $awaker
44
     * @param array|\Traversable $value
45
     *
46
     * @return array|Collection
47
     */
48 20
    public function awake(Awaker $awaker, $value)
49
    {
50 20
        if (false === $this->isIterable($value)) {
51 12
            return $this->createAwakeResult([]);
52
        }
53
54 8
        $nested = $this->nested;
55
56
        // TODO: we need a test that checks that an awaken map is a collection when a collection is specified
57
        // TODO: packing things into a collection should be a wrapper around this mapper and all other collection mappers
58 8
        return $this->createAwakeResult(
59 8
            $nested->getOptions()->keepNullValuesInCollections()
60 8
                ? $this->awakeKeepNulls($awaker, $value, $nested)
61 8
                : $this->awakeFilterNulls($awaker, $value, $nested)
62
        );
63
    }
64
65
    /**
66
     * @param Slumberer          $slumberer
67
     * @param array|\Traversable $value
68
     * @param Mapper             $nested
69
     *
70
     * @return \stdClass
71
     */
72 9
    private function slumberKeepNulls(Slumberer $slumberer, $value, Mapper $nested)
73
    {
74 9
        $result = new \stdClass();
75
76 9
        foreach ($value as $k => $v) {
77 5
            $result->$k = $nested->slumber($slumberer, $v);
78
        }
79
80 9
        return $result;
81
    }
82
83
    /**
84
     * @param Slumberer          $slumberer
85
     * @param array|\Traversable $value
86
     * @param Mapper             $nested
87
     *
88
     * @return \stdClass
89
     */
90 3
    private function slumberFilterNulls(Slumberer $slumberer, $value, Mapper $nested)
91
    {
92 3
        $result = new \stdClass();
93
94 3
        foreach ($value as $k => $v) {
95
96
            $slumbering = $nested->slumber($slumberer, $v);
97
98
            // check if we should keep nulls
99
            if ($slumbering !== null) {
100
                $result->$k = $slumbering;
101
            }
102
        }
103
104 3
        return $result;
105
    }
106
107
    /**
108
     * @param Awaker             $awaker
109
     * @param array|\Traversable $value
110
     * @param Mapper             $nested
111
     *
112
     * @return array
113
     */
114 8
    private function awakeKeepNulls(Awaker $awaker, $value, Mapper $nested)
115
    {
116 8
        $result = [];
117
118 8
        foreach ($value as $k => $v) {
119 6
            $result[$k] = $nested->awake($awaker, $v);
120
        }
121
122 8
        return $result;
123
124
    }
125
126
    /**
127
     * @param Awaker             $awaker
128
     * @param array|\Traversable $value
129
     * @param Mapper             $nested
130
     *
131
     * @return array
132
     */
133
    private function awakeFilterNulls(Awaker $awaker, $value, Mapper $nested)
134
    {
135
        $result = [];
136
137
        foreach ($value as $k => $v) {
138
139
            $awoken = $nested->awake($awaker, $v);
140
141
            // check if we should keep nulls
142
            if ($awoken !== null) {
143
                $result[$k] = $awoken;
144
            }
145
        }
146
147
        return $result;
148
    }
149
}
150