Passed
Push — master ( c327ca...afcee1 )
by Lynh
24:51 queued 09:54
created

ResponseHandler   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 13
c 1
b 0
f 0
dl 0
loc 66
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A createResponseHandler() 0 7 2
A getResponseHandler() 0 9 3
A __invoke() 0 5 1
A __construct() 0 3 1
1
<?php
2
3
namespace Jenky\Hermes\Middleware;
4
5
use InvalidArgumentException;
6
use Jenky\Hermes\Contracts\ResponseHandler as ResponseHandlerInterface;
7
use Psr\Http\Message\RequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
10
class ResponseHandler
11
{
12
    /**
13
     * The default response handler class name.
14
     *
15
     * @var string
16
     */
17
    protected $response;
18
19
    /**
20
     * Create a new handler instance.
21
     *
22
     * @param  string|null $response
23
     * @return void
24
     */
25
    public function __construct($response = null)
26
    {
27
        $this->response = $response;
28
    }
29
30
    /**
31
     * Handle the request.
32
     *
33
     * @param  callable $handler
34
     * @return callable
35
     */
36
    public function __invoke(callable $handler)
37
    {
38
        return function (RequestInterface $request, array $options) use ($handler) {
39
            return $handler($request, $options)->then(function (ResponseInterface $response) use ($options) {
40
                return $this->createResponseHandler($response, $options);
41
            });
42
        };
43
    }
44
45
    /**
46
     * Create response handler instance.
47
     *
48
     * @param  \Psr\Http\Message\ResponseInterface $response
49
     * @param  array $options
50
     * @return \Psr\Http\Message\ResponseInterface
51
     */
52
    protected function createResponseHandler(ResponseInterface $response, array $options): ResponseInterface
53
    {
54
        $handler = $this->getResponseHandler(
55
            $options['response_handler'] ?? $this->response
56
        );
57
58
        return $handler ? $handler::create($response) : $response;
59
    }
60
61
    /**
62
     * Get the response handler class name.
63
     *
64
     * @param  string $handler
65
     * @return string|null
66
     */
67
    protected function getResponseHandler($handler)
68
    {
69
        if ($handler && ! is_a($handler, ResponseHandlerInterface::class, true)) {
70
            throw new InvalidArgumentException(
71
                $handler.' must be an instance of '.ResponseHandlerInterface::class
72
            );
73
        }
74
75
        return $handler;
76
    }
77
}
78