Completed
Push — master ( 563711...fddb4c )
by Sergey
04:04
created

TypifiedValue::decode()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 33
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 33
ccs 8
cts 8
cp 1
rs 8.8571
cc 3
eloc 24
nc 3
nop 1
crap 3
1
<?php
2
3
namespace ButterAMQP\Value;
4
5
use ButterAMQP\Buffer;
6
use ButterAMQP\Exception\AMQP\NotImplementedException;
7
use ButterAMQP\Value;
8
9
class TypifiedValue extends AbstractValue
10
{
11
    /**
12
     * @param Buffer $data
13
     *
14
     * @return mixed
15
     */
16 44
    public static function decode(Buffer $data)
17
    {
18
        static $types = [
19
            't' => Value\BooleanValue::class.'::decode',
20
            'b' => Value\OctetValue::class.'::decode',
21
            'B' => Value\UnsignedOctetValue::class.'::decode',
22
            'U' => Value\ShortValue::class.'::decode',
23
            'u' => Value\UnsignedShortValue::class.'::decode',
24
            'I' => Value\LongValue::class.'::decode',
25
            'i' => Value\UnsignedLongValue::class.'::decode',
26
            'L' => Value\LongLongValue::class.'::decode',
27
            'l' => Value\UnsignedLongLongValue::class.'::decode',
28
            'f' => Value\FloatValue::class.'::decode',
29
            'd' => Value\DoubleValue::class.'::decode',
30
            's' => Value\ShortStringValue::class.'::decode',
31
            'S' => Value\LongStringValue::class.'::decode',
32
            'A' => Value\ArrayValue::class.'::decode',
33
            'T' => Value\TimestampValue::class.'::decode',
34
            'F' => Value\TableValue::class.'::decode',
35 44
        ];
36
37 44
        $hint = $data->read(1);
38
39 44
        if (isset($types[$hint])) {
40 42
            return call_user_func($types[$hint], $data);
41
        }
42
43 2
        if ($hint === 'V') {
44 1
            return null;
45
        }
46
47 1
        throw new \InvalidArgumentException(sprintf('Invalid type hint "%s"', $hint));
48
    }
49
50
    /**
51
     * @param mixed $value
52
     *
53
     * @return string
54
     *
55
     * @throws NotImplementedException
56
     */
57 44
    public static function encode($value)
58
    {
59
        static $types = [
60
            't' => Value\BooleanValue::class.'::encode',
61
            'b' => Value\OctetValue::class.'::encode',
62
            'B' => Value\UnsignedOctetValue::class.'::encode',
63
            'U' => Value\ShortValue::class.'::encode',
64
            'u' => Value\UnsignedShortValue::class.'::encode',
65
            'I' => Value\LongValue::class.'::encode',
66
            'i' => Value\UnsignedLongValue::class.'::encode',
67
            'L' => Value\LongLongValue::class.'::encode',
68
            'l' => Value\UnsignedLongLongValue::class.'::encode',
69
            'f' => Value\FloatValue::class.'::encode',
70
            'd' => Value\DoubleValue::class.'::encode',
71
            's' => Value\ShortStringValue::class.'::encode',
72
            'S' => Value\LongStringValue::class.'::encode',
73
            'A' => Value\ArrayValue::class.'::encode',
74
            'T' => Value\TimestampValue::class.'::encode',
75
            'F' => Value\TableValue::class.'::encode',
76 44
        ];
77
78 44
        $hint = self::guess($value);
79
80 43
        if ($value instanceof AbstractValue) {
81 16
            $value = $value->getValue();
82 16
        }
83
84 43
        if (isset($types[$hint])) {
85 42
            return $hint.call_user_func($types[$hint], $value);
86
        }
87
88 1
        return 'V';
89
    }
90
91
    /**
92
     * Guess value type hint.
93
     *
94
     * @param mixed $value
95
     *
96
     * @return string
97
     */
98 44
    private static function guess($value)
99
    {
100
        static $types = [
101
            Value\BooleanValue::class => 't',
102
            Value\OctetValue::class => 'b',
103
            Value\UnsignedOctetValue::class => 'B',
104
            Value\ShortValue::class => 'U',
105
            Value\UnsignedShortValue::class => 'u',
106
            Value\LongValue::class => 'I',
107
            Value\UnsignedLongValue::class => 'i',
108
            Value\LongLongValue::class => 'L',
109
            Value\UnsignedLongLongValue::class => 'l',
110
            Value\FloatValue::class => 'f',
111
            Value\DoubleValue::class => 'd',
112
            Value\ShortStringValue::class => 's',
113
            Value\LongStringValue::class => 'S',
114
            Value\ArrayValue::class => 'A',
115
            Value\TimestampValue::class => 'T',
116
            Value\TableValue::class => 'F',
117 44
        ];
118
119 44
        if ($value === null) {
120 1
            return 'V';
121
        }
122
123 43
        if (is_string($value)) {
124 25
            return 'S';
125
        }
126
127 42
        if (is_array($value) && isset($value[0])) {
128 1
            return 'A';
129
        }
130
131 42
        if (is_array($value)) {
132 19
            return 'F';
133
        }
134
135 42
        if (is_bool($value)) {
136 19
            return 't';
137
        }
138
139 23
        if (is_int($value)) {
140 7
            return 'I';
141
        }
142
143 18
        if (is_float($value)) {
144 1
            return 'f';
145
        }
146
147 17
        if (is_object($value)) {
148 17
            $type = get_class($value);
149
150 17
            if (isset($types[$type])) {
151 16
                return $types[$type];
152
            }
153 1
        }
154
155 1
        throw new \InvalidArgumentException(sprintf(
156 1
            'Invalid value type "%s"',
157 1
            is_object($value) ? get_class($value) : gettype($value)
158 1
        ));
159
    }
160
}
161