Passed
Push — master ( b22a88...886da7 )
by Marcel
02:28
created

Input::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 26
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 2.0023

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 18
c 2
b 0
f 0
nc 2
nop 2
dl 0
loc 26
ccs 11
cts 12
cp 0.9167
crap 2.0023
rs 9.6666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace UMA\JsonRpc\Internal;
6
7
use stdClass;
8
9
final class Input
10
{
11
    /**
12
     * @var stdClass
13
     */
14
    private static $schema;
15
16
    /**
17
     * @var mixed
18
     */
19
    private $data;
20
21
    /**
22
     * @var int
23
     */
24
    private $error;
25
26 49
    private function __construct($data, int $error)
27
    {
28 49
        $this->data = $data;
29 49
        $this->error = $error;
30
31
        // This is the minimal schema that all incoming payloads must
32
        // conform to in order to be considered well-formed JSON-RPC requests.
33 49
        if (!self::$schema instanceof stdClass) {
0 ignored issues
show
introduced by
self::schema is always a sub-type of stdClass.
Loading history...
34
            self::$schema = (object)[
35 1
                '$schema' => 'https://json-schema.org/draft-07/schema#',
36 1
                'description' => 'JSON-RPC 2.0 single request schema',
37 1
                'type' => 'object',
38
                'required' => ['jsonrpc', 'method'],
39
                'additionalProperties' => false,
40
                'properties' => (object)[
41
                    'jsonrpc' => (object)[
42 1
                        'enum' => ['2.0']
43
                    ],
44
                    'method' => (object)[
45 1
                        'type' => 'string'
46
                    ],
47
                    'params' => (object)[
48 1
                        'type' => ['array', 'object']
49
                    ],
50
                    'id' => (object)[
51 1
                        'type' => ['integer', 'string']
52
                    ],
53
                ]
54
            ];
55
        }
56 49
    }
57
58 48
    public static function fromString(string $raw, bool $simdJson): Input
59
    {
60 48
        if (!$simdJson || !\extension_loaded('simdjson')) {
61 48
            return new self(\json_decode($raw), \json_last_error());
62
        }
63
64
        if (!\simdjson_isvalid($raw)) {
0 ignored issues
show
Bug introduced by
The function simdjson_isvalid was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

64
        if (!/** @scrutinizer ignore-call */ \simdjson_isvalid($raw)) {
Loading history...
65
            return new self(null, JSON_ERROR_SYNTAX);
66
        }
67
68
        return new self(\simdjson_decode($raw), JSON_ERROR_NONE);
0 ignored issues
show
Bug introduced by
The function simdjson_decode was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

68
        return new self(/** @scrutinizer ignore-call */ \simdjson_decode($raw), JSON_ERROR_NONE);
Loading history...
69
    }
70
71 5
    public static function fromSafeData($data): Input
72
    {
73 5
        \assert(false !== \json_encode($data));
74
75 5
        return new self($data, JSON_ERROR_NONE);
76
    }
77
78 41
    public function data()
79
    {
80 41
        return $this->data;
81
    }
82
83 48
    public function parsable(): bool
84
    {
85 48
        return JSON_ERROR_NONE === $this->error;
86
    }
87
88 44
    public function isArray(): bool
89
    {
90 44
        return \is_array($this->data) && !empty($this->data);
91
    }
92
93 27
    public function isRpcRequest(): bool
94
    {
95 27
        return Validator::validate(self::$schema, $this->data);
96
    }
97
}
98