Completed
Push — master ( cb945d...f8ce6a )
by Nathan
01:47
created

GetBlockTemplateValidator::validateMode()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 3
eloc 2
nc 2
nop 1
1
<?php
2
3
namespace ZenCash\Rpc\Validation\Mining;
4
5
use ZenCash\Rpc\Validation\Exception\JsonFormatException;
6
use ZenCash\Rpc\Validation\JsonValidator;
7
8
final class GetBlockTemplateValidator implements JsonValidator
9
{
10
    /** @throws JsonFormatException */
11
    public static function validate(string $json): void
12
    {
13
        if (!$decoded = json_decode($json)) {
14
            throw new JsonFormatException("JSON object has an invalid structure:\n$json");
15
        }
16
17
        self::validateMode($decoded);
18
19
        self::validateCapabilities($decoded);
20
    }
21
22
    /** @throws JsonFormatException */
23
    private static function validateMode(object $decoded): void
24
    {
25
        if (($decoded->mode ?? false) && ($decoded->mode !== 'template')) {
26
            throw new JsonFormatException("JSON property `mode` must be either 'template' or omitted.");
27
        }
28
    }
29
30
    /** @throws JsonFormatException */
31
    private static function validateCapabilities(object $decoded): void
32
    {
33
        if ($decoded->capabilities ?? false) {
34
            if (!is_array($decoded->capabilities)) {
35
                throw new JsonFormatException(
36
                    'JSON property `capabilities` must be of type `array`, `' .
37
                    gettype($decoded->capabilities) . '` provided.'
38
                );
39
            }
40
41
            array_walk($decoded->capabilities, function ($item) {
42
                if (!is_string($item)) {
43
                    throw new JsonFormatException("JSON property `capabilities` must only contain strings.");
44
                }
45
            });
46
        }
47
    }
48
}
49