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

Transformer   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 97.44%

Importance

Changes 0
Metric Value
dl 0
loc 84
ccs 38
cts 39
cp 0.9744
rs 10
c 0
b 0
f 0
wmc 19
lcom 1
cbo 1

4 Methods

Rating   Name   Duplication   Size   Complexity  
A transform() 0 8 2
B transformCollection() 0 14 5
C parseIncludes() 0 27 8
A transformSingle() 0 14 4
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