HeaderDecoder::decodeHeader()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 2
dl 0
loc 13
ccs 8
cts 8
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace DaveRandom\LibLifxLan\Decoding;
4
5
use DaveRandom\LibLifxLan\Decoding\Exceptions\DecodingException;
6
use DaveRandom\LibLifxLan\Decoding\Exceptions\InsufficientDataException;
7
use DaveRandom\LibLifxLan\Header\Frame;
8
use DaveRandom\LibLifxLan\Header\FrameAddress;
9
use DaveRandom\LibLifxLan\Header\Header;
10
11
final class HeaderDecoder
12
{
13
    private const FRAME_OFFSET = 0;
14
    private const FRAME_ADDRESS_OFFSET = self::FRAME_OFFSET + Frame::WIRE_SIZE;
15
    private const PROTOCOL_HEADER_OFFSET = self::FRAME_ADDRESS_OFFSET + FrameAddress::WIRE_SIZE;
16
17
    private $frameDecoder;
18
    private $frameAddressDecoder;
19
    private $protocolHeaderDecoder;
20
21 26
    public function __construct(FrameDecoder $frameDecoder = null, FrameAddressDecoder $frameAddressDecoder = null, ProtocolHeaderDecoder $protocolHeaderDecoder = null)
22
    {
23 26
        $this->frameDecoder = $frameDecoder ?? new FrameDecoder;
24 26
        $this->frameAddressDecoder = $frameAddressDecoder ?? new FrameAddressDecoder;
25 26
        $this->protocolHeaderDecoder = $protocolHeaderDecoder ?? new ProtocolHeaderDecoder;
26
    }
27
28 2
    public function getFrameDecoder(): FrameDecoder
29
    {
30 2
        return $this->frameDecoder;
31
    }
32
33 2
    public function getFrameAddressDecoder(): FrameAddressDecoder
34
    {
35 2
        return $this->frameAddressDecoder;
36
    }
37
38 2
    public function getProtocolHeaderDecoder(): ProtocolHeaderDecoder
39
    {
40 2
        return $this->protocolHeaderDecoder;
41
    }
42
43
    /**
44
     * @param string $data
45
     * @param int $offset
46
     * @return Header
47
     * @throws InsufficientDataException
48
     * @throws DecodingException
49
     */
50 8
    public function decodeHeader(string $data, int $offset = 0): Header
51
    {
52 8
        if ((\strlen($data) - $offset) < Header::WIRE_SIZE) {
53 2
            throw new InsufficientDataException(
54 2
                "Header requires " . Header::WIRE_SIZE . " bytes, got " . (\strlen($data) - $offset) . " bytes"
55
            );
56
        }
57
58 6
        $frame = $this->frameDecoder->decodeFrame($data, $offset + self::FRAME_OFFSET);
59 6
        $frameAddress = $this->frameAddressDecoder->decodeFrameAddress($data, $offset + self::FRAME_ADDRESS_OFFSET);
60 6
        $protocolHeader = $this->protocolHeaderDecoder->decodeProtocolHeader($data, $offset + self::PROTOCOL_HEADER_OFFSET);
61
62 6
        return new Header($frame, $frameAddress, $protocolHeader);
63
    }
64
}
65