MiddlewareHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
/**
4
 * This file is part of the tarantool/client package.
5
 *
6
 * (c) Eugene Leonovich <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace Tarantool\Client\Handler;
15
16
use Tarantool\Client\Connection\Connection;
17
use Tarantool\Client\Middleware\Middleware;
18
use Tarantool\Client\Packer\Packer;
19
use Tarantool\Client\Request\Request;
20
use Tarantool\Client\Response;
21
22
final class MiddlewareHandler implements Handler
23
{
24
    /** @var Handler */
25
    private $handler;
26
27
    /** @var Middleware[] */
28
    private $middleware;
29
30
    /** @var int */
31
    private $index = 0;
32
33
    /**
34
     * @param Handler $handler
35
     * @param Middleware[] $middleware
36
     */
37 140
    private function __construct($handler, $middleware)
38
    {
39 140
        $this->handler = $handler;
40 140
        $this->middleware = $middleware;
41
    }
42
43
    /**
44
     * @param Middleware[] $middleware
45
     */
46 136
    public static function append(Handler $handler, array $middleware) : Handler
47
    {
48 136
        if (!$handler instanceof self) {
49 136
            return new self($handler, $middleware);
50
        }
51
52 12
        $handler = clone $handler;
53 12
        $handler->middleware = \array_merge($handler->middleware, $middleware);
54
55 12
        return $handler;
56
    }
57
58
    /**
59
     * @param Middleware[] $middleware
60
     */
61 8
    public static function prepend(Handler $handler, array $middleware) : Handler
62
    {
63 8
        if (!$handler instanceof self) {
64 4
            return new self($handler, $middleware);
65
        }
66
67 8
        $handler = clone $handler;
68 8
        $handler->middleware = \array_merge($middleware, $handler->middleware);
69
70 8
        return $handler;
71
    }
72
73 124
    public function handle(Request $request) : Response
74
    {
75 124
        if (!isset($this->middleware[$this->index])) {
76 104
            return $this->handler->handle($request);
77
        }
78
79 124
        $new = clone $this;
80 124
        ++$new->index;
81
82 124
        return $this->middleware[$this->index]->process($request, $new);
83
    }
84
85 76
    public function getConnection() : Connection
86
    {
87 76
        return $this->handler->getConnection();
88
    }
89
90 4
    public function getPacker() : Packer
91
    {
92 4
        return $this->handler->getPacker();
93
    }
94
}
95