Failed Conditions
Pull Request — release/3.0.0-dev (#32)
by Yo
01:46
created

JsonRpcRequestDenormalizer::bindIdIfProvided()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 2
nop 2
dl 0
loc 8
ccs 6
cts 6
cp 1
crap 3
rs 9.4285
c 0
b 0
f 0
1
<?php
2
namespace Yoanm\JsonRpcServer\App\Serialization;
3
4
use Yoanm\JsonRpcServer\Domain\Exception\JsonRpcInvalidRequestException;
5
use Yoanm\JsonRpcServer\Domain\Model\JsonRpcRequest;
6
7
/**
8
 * Class JsonRpcRequestDenormalizer
9
 */
10
class JsonRpcRequestDenormalizer
11
{
12
13
    const KEY_JSON_RPC = 'jsonrpc';
14
    const KEY_ID = 'id';
15
    const KEY_METHOD = 'method';
16
    const KEY_PARAM_LIST = 'params';
17
18
    /**
19
     * @param mixed $item Should be an array
20
     *
21
     * @return JsonRpcRequest
22
     *
23
     * @throws JsonRpcInvalidRequestException
24
     */
25 9
    public function denormalize($item) : JsonRpcRequest
26
    {
27 9
        $this->validateArray($item, 'Item must be an array');
28
29
        // Validate json-rpc and method keys
30 9
        $this->validateRequiredKey($item, self::KEY_JSON_RPC);
31 8
        $this->validateRequiredKey($item, self::KEY_METHOD);
32
33 7
        $request = new JsonRpcRequest(
34 7
            $item[self::KEY_JSON_RPC],
35 7
            $item[self::KEY_METHOD]
36
        );
37
38 7
        $this->bindIdIfProvided($request, $item);
39 7
        $this->bindParamListIfProvided($request, $item);
40
41 4
        return $request;
42
    }
43
44
    /**
45
     * @param JsonRpcRequest $request
46
     * @param array $item
47
     * @return array
48
     */
49 7
    protected function bindIdIfProvided(JsonRpcRequest $request, array $item)
50
    {
51
        /** If no id defined => request is a notification */
52 7
        if (isset($item[self::KEY_ID])) {
53 6
            $request->setId(
54 6
                $item[self::KEY_ID] == (string)((int)$item[self::KEY_ID])
55 2
                    ? (int)$item[self::KEY_ID] // Convert it in case it's a string containing an int
56 6
                    : (string)$item[self::KEY_ID] // Convert to string in all other cases
57
            );
58
        }
59 7
    }
60
61
    /**
62
     * @param JsonRpcRequest $request
63
     * @param array          $item
64
     *
65
     * @throws JsonRpcInvalidRequestException
66
     */
67 7
    protected function bindParamListIfProvided(JsonRpcRequest $request, array $item)
68
    {
69 7
        if (isset($item[self::KEY_PARAM_LIST])) {
70 4
            $paramList = $item[self::KEY_PARAM_LIST];
71 4
            $this->validateArray($paramList, 'Parameter list must be an array');
72 1
            $request->setParamList($paramList);
73
        }
74 4
    }
75
76
    /**
77
     * @param mixed  $value
78
     * @param string $errorDescription
79
     *
80
     * @return array
81
     *
82
     * @throws JsonRpcInvalidRequestException
83
     */
84 9
    private function validateArray($value, string $errorDescription) : array
85
    {
86 9
        if (!is_array($value)) {
87 3
            throw new JsonRpcInvalidRequestException($value, $errorDescription);
88
        }
89
90 9
        return $value;
91
    }
92
93
    /**
94
     * @param array  $item
95
     * @param string $key
96
     *
97
     * @throws JsonRpcInvalidRequestException
98
     */
99 9
    private function validateRequiredKey(array $item, string $key)
100
    {
101 9
        if (!isset($item[$key])) {
102 2
            throw new JsonRpcInvalidRequestException(
103 2
                $item,
104 2
                sprintf('"%s" is a required key', $key)
105
            );
106
        }
107 8
    }
108
}
109