Completed
Pull Request — master (#24)
by
unknown
03:52
created

Transformer::parseIncludes()   C

Complexity

Conditions 8
Paths 37

Size

Total Lines 27
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 8.0109

Importance

Changes 0
Metric Value
dl 0
loc 27
c 0
b 0
f 0
cc 8
eloc 19
nc 37
nop 2
ccs 17
cts 18
cp 0.9444
crap 8.0109
rs 5.3846
1
<?php
2
namespace Wandu\Transformer;
3
4
use Wandu\Transformer\Contracts\TransformResource;
5
use Traversable;
6
7
class Transformer
8
{
9
    /**
10
     * @param \Wandu\Transformer\Contracts\TransformResource|array|\Traversable $resource
11
     * @param array $includes
12
     * @return array
13
     */
14 6
    public function transform($resource, array $includes = [])
15
    {
16 6
        if ($resource instanceof TransformResource) {
17 4
            return $this->transformSingle($resource, $includes);
18
        }
19
        // iterator or Traversable
20 2
        return $this->transformCollection($resource, $includes);
21
    }
22
    
23 6
    private function transformSingle(TransformResource $resource, $includes = [])
24
    {
25 6
        $entity = $resource->transform();
26 6
        if (!is_array($entity)) return $entity;
27
28
        // now, result is always array
29 6
        foreach ($this->parseIncludes($resource, $includes) as $key => $nextIncludes) {
30 3
            $entity = array_merge(
31 3
                $entity,
32 3
                $this->transformCollection($resource->includeAttribute($key) ?: [], $nextIncludes)
33
            );
34
        }
35 6
        return $entity;
36
    }
37
38
    /**
39
     * @param array|\Traversable $resources
40
     * @param array $includes
41
     * @return array
42
     */
43 4
    private function transformCollection($resources, array $includes = [])
44
    {
45 4
        $result = [];
46 4
        foreach ($resources as $key => $resource) {
47 4
            if (is_array($resource) || $resource instanceof Traversable) {
48 1
                $result[$key] = $this->transformCollection($resource, $includes);
49 4
            } elseif ($resource instanceof TransformResource) {
50 3
                $result[$key] = $this->transformSingle($resource, $includes);
51
            } else {
52 4
                $result[$key] = $resource;
53
            }
54
        }
55 4
        return $result;
56
    }
57
58
    /**
59
     * @param \Wandu\Transformer\Contracts\TransformResource $origin
60
     * @param array $includes
61
     * @return array
62
     */
63 6
    private function parseIncludes(TransformResource $origin, array $includes = [])
64
    {
65 6
        $parsedIncludes = [];
66 6
        foreach ($includes as $include => $condition) {
67 3
            if (is_integer($include)) {
68 3
                $include = $condition;
69 3
                $condition = true;
70
            }
71 3
            while (is_callable($condition)) {
72 3
                $condition = call_user_func($condition, $origin);
73
            }
74 3
            if (!$condition) continue;
75 3
            if (strpos($include, '.') === false) {
76 3
                $key = $include;
77 3
                $param = null;
78
            } else {
79
                list($key, $param) = explode('.', $include, 2);
80
            }
81 3
            if (!isset($parsedIncludes[$key])) {
82 3
                $parsedIncludes[$key] = [];
83
            }
84 3
            if ($param) {
85 3
                $parsedIncludes[$key][] = $param;
86
            }
87
        }
88 6
        return $parsedIncludes;
89
    }
90
}
91