Passed
Push — remanufacture/json-object-deco... ( 5405f8...fe5ece )
by Bas
05:33
created

HandlesJson::jsonEncode()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 7
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 14
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ArangoClient;
6
7
use ArangoClient\Exceptions\ArangoException;
8
use GuzzleHttp\Psr7\StreamWrapper;
9
use JsonMachine\JsonDecoder\ExtJsonDecoder;
10
use JsonMachine\JsonMachine;
11
use Psr\Http\Message\ResponseInterface;
12
use stdClass;
13
14
trait HandlesJson
15
{
16
17
18
    /**
19
     * @param  mixed  $data
20
     * @return string
21
     * @throws ArangoException
22
     */
23
    public function jsonEncode(mixed $data): string
24
    {
25
        $options = 0;
26
        if (empty($data)) {
27
            $options = JSON_FORCE_OBJECT;
28
        }
29
30
        $response = json_encode($data, $options);
31
32
        if ($response === false) {
33
            throw new ArangoException('JSON encoding failed with error: ' . json_last_error_msg(), json_last_error());
34
        }
35
36
        return $response;
37
    }
38
39
40
    /**
41
     * @psalm-suppress MixedAssignment, MixedArrayOffset
42
     * @SuppressWarnings(PHPMD.StaticAccess)
43
     *
44
     * @param  ResponseInterface|null  $response
45
     * @return stdClass
46
     */
47
    protected function decodeResponse(?ResponseInterface $response): stdClass
48
    {
49
        $decodedResponse = new stdClass();
50
        if (! isset($response)) {
51
            return $decodedResponse;
52
        }
53
54
        $phpStream = StreamWrapper::getResource($response->getBody());
55
        $decoder = new ExtJsonDecoder(false);
56
        $decodedStream = JsonMachine::fromStream($phpStream, '', $decoder);
57
58
        foreach ($decodedStream as $key => $value) {
59
            $decodedResponse->$key = $value;
60
        }
61
62
        return $decodedResponse;
63
    }
64
}
65