Completed
Push — master ( e98ae3...0e888f )
by Matt
02:50
created

validateAdditionalItemsAgainstSchema()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 11
nc 2
nop 4
dl 0
loc 16
ccs 8
cts 8
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace League\JsonGuard\Constraints;
4
5
use League\JsonGuard\Assert;
6
use League\JsonGuard\SubSchemaValidatorFactory;
7
use League\JsonGuard\ValidationError;
8
9
class AdditionalItems implements ParentSchemaAwareContainerInstanceConstraint
10
{
11
    const KEYWORD = 'additionalItems';
12
13
    /**
14
     * {@inheritdoc}
15
     */
16 6
    public static function validate(
17
        $data,
18
        $schema,
19
        $parameter,
20
        SubSchemaValidatorFactory $validatorFactory,
21
        $pointer = null
22
    ) {
23 6
        Assert::type($parameter, ['boolean', 'object'], self::KEYWORD, $pointer);
24
25 4
        if (!is_array($data) || $parameter === true) {
26 4
            return null;
27
        }
28
29
30 4
        if (!is_array($items = self::getItems($schema))) {
31 4
            return null;
32
        }
33
34 4
        if ($parameter === false) {
35 4
            return self::validateAdditionalItemsWhenNotAllowed($data, $items, $pointer);
36 4
        } elseif (is_object($parameter)) {
37 4
            $additionalItems = array_slice($data, count($items));
38
39 4
            return self::validateAdditionalItemsAgainstSchema(
40 4
                $additionalItems,
41 4
                $parameter,
42 4
                $validatorFactory,
43
                $pointer
44 4
            );
45
        }
46
47
        return null;
48
    }
49
50
    /**
51
     * @param object $schema
52
     *
53
     * @return mixed
54
     */
55 4
    private static function getItems($schema)
56
    {
57 4
        return property_exists($schema, 'items') ? $schema->items : null;
58
    }
59
60
    /**
61
     * @param array                                       $items
62
     * @param object                                      $schema
63
     * @param \League\JsonGuard\SubSchemaValidatorFactory $validatorFactory
64
     * @param string                                      $pointer
65
     *
66
     * @return array
67
     */
68 4
    private static function validateAdditionalItemsAgainstSchema(
69
        $items,
70
        $schema,
71
        SubSchemaValidatorFactory $validatorFactory,
72
        $pointer
73
    ) {
74 4
        $errors = [];
75 4
        foreach ($items as $key => $item) {
76
            // Escaping isn't necessary since the key is always numeric.
77 4
            $currentPointer = $pointer . '/' . $key;
78 4
            $validator      = $validatorFactory->makeSubSchemaValidator($item, $schema, $currentPointer);
79 4
            $errors         = array_merge($errors, $validator->errors());
80 4
        }
81
82 4
        return $errors;
83
    }
84
85
    /**
86
     * @param array $data
87
     * @param array $items
88
     * @param $pointer
89
     *
90
     * @return \League\JsonGuard\ValidationError
91
     */
92 4
    private static function validateAdditionalItemsWhenNotAllowed($data, $items, $pointer)
93
    {
94 4
        if (count($data) > count($items)) {
95 4
            return new ValidationError(
96 4
                'Additional items are not allowed.',
97 4
                self::KEYWORD,
98 4
                $data,
99
                $pointer
100 4
            );
101
        }
102 4
    }
103
}
104