Completed
Push — master ( d025ba...cd6efa )
by Chris
04:35
created

HeaderDecoder::decodeHeader()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2.0625

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 2
dl 0
loc 13
ccs 6
cts 8
cp 0.75
crap 2.0625
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 8
    public function __construct(FrameDecoder $frameDecoder = null, FrameAddressDecoder $frameAddressDecoder = null, ProtocolHeaderDecoder $protocolHeaderDecoder = null)
22
    {
23 8
        $this->frameDecoder = $frameDecoder ?? new FrameDecoder;
24 8
        $this->frameAddressDecoder = $frameAddressDecoder ?? new FrameAddressDecoder;
25 8
        $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 DecodingException
48
     */
49 2
    public function decodeHeader(string $data, int $offset = 0): Header
50
    {
51 2
        if ((\strlen($data) - $offset) < Header::WIRE_SIZE) {
52
            throw new InsufficientDataException(
53
                "Header requires " . Header::WIRE_SIZE . " bytes, got " . (\strlen($data) - $offset) . " bytes"
54
            );
55
        }
56
57 2
        $frame = $this->frameDecoder->decodeFrame($data, $offset + self::FRAME_OFFSET);
58 2
        $frameAddress = $this->frameAddressDecoder->decodeFrameAddress($data, $offset + self::FRAME_ADDRESS_OFFSET);
59 2
        $protocolHeader = $this->protocolHeaderDecoder->decodeProtocolHeader($data, $offset + self::PROTOCOL_HEADER_OFFSET);
60
61 2
        return new Header($frame, $frameAddress, $protocolHeader);
62
    }
63
}
64