ResponseCastable::castResponseToType()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 6.0106

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 6
eloc 15
c 1
b 0
f 1
nc 6
nop 2
dl 0
loc 20
ccs 14
cts 15
cp 0.9333
crap 6.0106
rs 9.2222
1
<?php
2
3
namespace EasyIM\Kernel\Traits;
4
5
use EasyIM\Kernel\Contracts\Arrayable;
6
use EasyIM\Kernel\Exceptions\InvalidArgumentException;
7
use EasyIM\Kernel\Exceptions\InvalidConfigException;
8
use EasyIM\Kernel\Http\Response;
9
use EasyIM\Kernel\Support\Collection;
10
use Psr\Http\Message\ResponseInterface;
11
12
/**
13
 * Trait ResponseCastable.
14
 */
15
trait ResponseCastable
16
{
17
    /**
18
     * @param \Psr\Http\Message\ResponseInterface $response
19
     * @param string|null                         $type
20
     *
21
     * @return array|\EasyIM\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
22
     *
23
     * @throws \EasyIM\Kernel\Exceptions\InvalidConfigException
24
     */
25 3
    protected function castResponseToType(ResponseInterface $response, $type = null)
26
    {
27 3
        $response = Response::buildFromPsrResponse($response);
28 3
        $response->getBody()->rewind();
29
30 3
        switch ($type ?? 'array') {
31 3
            case 'collection':
32 2
                return $response->toCollection();
33 3
            case 'array':
34 3
                return $response->toArray();
35 2
            case 'object':
36 1
                return $response->toObject();
37 2
            case 'raw':
38 2
                return $response;
39
            default:
40 1
                if (!is_subclass_of($type, Arrayable::class)) {
41 1
                    throw new InvalidConfigException(sprintf('Config key "response_type" classname must be an instanceof %s', Arrayable::class));
42
                }
43
44
                return new $type($response);
45
        }
46
    }
47
48
    /**
49
     * @param mixed       $response
50
     * @param string|null $type
51
     *
52
     * @return array|\EasyIM\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
53
     *
54
     * @throws \EasyIM\Kernel\Exceptions\InvalidArgumentException
55
     * @throws \EasyIM\Kernel\Exceptions\InvalidConfigException
56
     */
57 1
    protected function detectAndCastResponseToType($response, $type = null)
58
    {
59
        switch (true) {
60 1
            case $response instanceof ResponseInterface:
61 1
                $response = Response::buildFromPsrResponse($response);
62
63 1
                break;
64 1
            case $response instanceof Arrayable:
65 1
                $response = new Response(200, [], json_encode($response->toArray()));
66
67 1
                break;
68 1
            case ($response instanceof Collection) || is_array($response) || is_object($response):
69 1
                $response = new Response(200, [], json_encode($response));
70
71 1
                break;
72 1
            case is_scalar($response):
73 1
                $response = new Response(200, [], (string) $response);
74
75 1
                break;
76
            default:
77 1
                throw new InvalidArgumentException(sprintf('Unsupported response type "%s"', gettype($response)));
78
        }
79
80 1
        return $this->castResponseToType($response, $type);
81
    }
82
}
83