Completed
Push — master ( 3227e8...9ee0a2 )
by Karsten
03:50
created

MapMapper::awake()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 23
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 11
cts 11
cp 1
rs 8.5906
c 0
b 0
f 0
cc 6
eloc 11
nc 4
nop 2
crap 6
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\Slumberer;
12
13
/**
14
 * @method AsMap getOptions()
15
 *
16
 * @author Karsten J. Gerber <[email protected]>
17
 */
18
class MapMapper extends AbstractCollectionMapper
19
{
20
    /**
21
     * @param Slumberer          $slumberer
22
     * @param array|\Traversable $value
23
     *
24
     * @return null|\stdClass We return a std class as this will ensure json-encode will create something like {"0":1}
25
     */
26 31
    public function slumber(Slumberer $slumberer, $value) : ?\stdClass
27
    {
28 31
        if (! is_array($value) && ! $value instanceof \Traversable) {
29 8
            return null;
30
        }
31
32 23
        $result    = new \stdClass();
33 23
        $nested    = $this->nested;
34 23
        $keepNulls = $nested->getOptions()->keepNullValuesInCollections();
35
36 23
        foreach ($value as $k => $v) {
37
38 22
            $slumbering = $nested->slumber($slumberer, $v);
39
40
            // check if we should keep nulls
41 22
            if ($slumbering !== null || $keepNulls) {
42 22
                $result->$k = $slumbering;
43
            }
44
        }
45
46 23
        return $result;
47
    }
48
49
    /**
50
     * @param Awaker             $awaker
51
     * @param array|\Traversable $value
52
     *
53
     * @return array|Collection
54
     */
55 27
    public function awake(Awaker $awaker, $value)
56
    {
57 27
        if (! is_array($value) && ! $value instanceof \Traversable) {
58 6
            return $this->createAwakeResult([]);
59
        }
60
61 21
        $result    = [];
62 21
        $nested    = $this->nested;
63 21
        $keepNulls = $nested->getOptions()->keepNullValuesInCollections();
64
65 21
        foreach ($value as $k => $v) {
66
67 20
            $awoken = $nested->awake($awaker, $v);
68
69
            // check if we should keep nulls
70 20
            if ($awoken !== null || $keepNulls) {
71 20
                $result[$k] = $awoken;
72
            }
73
        }
74
75
        // do we need to instantiate a collection class ?
76 21
        return $this->createAwakeResult($result);
77
    }
78
}
79