CallableHandler::setHandler()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 1
c 1
b 0
f 1
nc 1
nop 2
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
/**
3
 * Copyright Aleksandar Panic
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 **/
17
18
namespace ArekX\DataStreamer\Data;
19
20
use ArekX\DataStreamer\Contracts\Message;
21
use ArekX\DataStreamer\Contracts\MessageHandler;
22
use Exception;
23
24
/**
25
 * Class CallableHandler
26
 * @package ArekX\DataStreamer\Data
27
 *
28
 * Represents a callable handler which
29
 * handles the message.
30
 *
31
 * @see Message
32
 */
33
class CallableHandler implements MessageHandler
34
{
35
    /**
36
     * Registered handlers by type.
37
     * Type is the key and callable is the value.
38
     *
39
     * @var callable[]
40
     */
41
    protected $handlers = [];
42
43
    /**
44
     * Represents a default callable handler
45
     * when no type is registered.
46
     * If this is not set and no type is found
47
     * this class will throw an exception.
48
     *
49
     * @see CallableHandler::handle()
50
     * @var callable
51
     */
52
    protected $defaultHandler;
53
54
    /**
55
     * Sets a callable which will handle the message.
56
     *
57
     * Callable should be in the format:
58
     * ```php
59
     * function(Message $message) {
60
     * }
61
     * ```
62
     *
63
     * @param string $type
64
     * @param callable $handler
65
     */
66 7
    public function setHandler(string $type, callable $handler)
67
    {
68 7
        $this->handlers[$type] = $handler;
69 7
    }
70
71
    /**
72
     * Sets a default callable which will handle the message if it
73
     * is not resolved by type.
74
     *
75
     * Callable should be in the format:
76
     * ```php
77
     * function(Message $message) {
78
     * }
79
     * ```
80
     *
81
     * @param callable $handler
82
     */
83 1
    public function setDefaultHandler(callable $handler)
84
    {
85 1
        $this->defaultHandler = $handler;
86 1
    }
87
88
    /**
89
     * Handles a message by calling a callable
90
     * from a type or a default handler.
91
     *
92
     * @param Message $message Message to be handled
93
     * @throws Exception Exception which will be thrown if no callable is found and default is not set.
94
     */
95 6
    public function handle(Message $message): void
96
    {
97 6
        $handleMessage = $this->defaultHandler;
98
99 6
        if (!empty($this->handlers[$message->getType()])) {
100 4
            $handleMessage = $this->handlers[$message->getType()];
101
        }
102
103 6
        if (!is_callable($handleMessage)) {
104 1
            throw new Exception('Cannot handle message: ' . ($message->getId() ?: 'Unknown ID'));
105
        }
106
107 5
        $handleMessage($message);
108
    }
109
}