Passed
Push — master ( c493bc...401b4d )
by Nikita
03:14 queued 11s
created

BinnObjectEncoder   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Importance

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

3 Methods

Rating   Name   Duplication   Size   Complexity  
A encode() 0 29 4
A __construct() 0 3 1
A supportsEncoding() 0 3 2
1
<?php
2
3
namespace Knik\Binn\Encoder\Containers;
4
5
use Knik\Binn\Binn;
6
use Knik\Binn\Contracts\BinnValueEncoder;
7
use Knik\Binn\Encoder\EncoderCollection;
8
use Knik\Binn\Encoder\Packer;
9
10
class BinnObjectEncoder implements BinnValueEncoder
11
{
12
    public const TYPE = Binn::BINN_OBJECT;
13
14
    /** @var EncoderCollection */
15
    private $encoders;
16
17
    public function __construct(EncoderCollection $encoders)
18
    {
19
        $this->encoders = $encoders;
20
    }
21
22
    public function encode($value): string
23
    {
24
        $encodedData = '';
25
26
        $count = 0;
27
        foreach ($value as $key => $item) {
28
            $count++;
29
            /** @var BinnValueEncoder $encoder */
30
            foreach ($this->encoders->getAll() as $encoder) {
31
                if ($encoder->supportsEncoding($item)) {
32
                    $encodedData .= Packer::packUint8(strlen($key));
33
                    $encodedData .= Packer::packString($key);
34
                    $encodedData .= $encoder->encode($item);
35
                    break;
36
                }
37
            }
38
        }
39
40
        $encodedType  = Packer::packUint8(self::TYPE);
41
        $encodedCount = Packer::packSize($count);
42
        $encodedSize  = Packer::packSize(
43
            strlen($encodedType) + strlen($encodedCount) + strlen($encodedData),
44
            true
45
        );
46
47
        return $encodedType
48
            . $encodedSize
49
            . $encodedCount
50
            . $encodedData;
51
    }
52
53
    public function supportsEncoding($value): bool
54
    {
55
        return is_array($value) || is_object($value);
56
    }
57
}
58