ArrayField::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
rs 10
cc 1
eloc 3
nc 1
nop 2
1
<?php
2
namespace rtens\domin\delivery\cli\fields;
3
4
use rtens\domin\delivery\cli\CliField;
5
use rtens\domin\delivery\FieldRegistry;
6
use rtens\domin\delivery\ParameterReader;
7
use rtens\domin\Parameter;
8
use watoki\reflect\type\ArrayType;
9
10
class ArrayField implements CliField {
11
12
    /** @var FieldRegistry */
13
    private $fields;
14
15
    /** @var ParameterReader */
16
    private $reader;
17
18
    public function __construct(FieldRegistry $fields, ParameterReader $reader) {
19
        $this->fields = $fields;
20
        $this->reader = $reader;
21
    }
22
23
    /**
24
     * @param Parameter $parameter
25
     * @return bool
26
     */
27
    public function handles(Parameter $parameter) {
28
        return $parameter->getType() instanceof ArrayType;
29
    }
30
31
    /**
32
     * @param Parameter $parameter
33
     * @param string $serialized
34
     * @return array
35
     */
36
    public function inflate(Parameter $parameter, $serialized) {
37
38
        $items = [];
39
        for ($i = 0; $i < $serialized; $i++) {
40
            $itemParameter = $this->makeInnerParameter($parameter, "-$i");
41
            $field = $this->getField($itemParameter);
42
            $items[] = $field->inflate($itemParameter, $this->reader->read($itemParameter));
43
        }
44
        return $items;
45
    }
46
47
    /**
48
     * @param Parameter $parameter
49
     * @param string $suffix
50
     * @return Parameter
51
     */
52
    private function makeInnerParameter(Parameter $parameter, $suffix = '') {
53
        /** @var ArrayType $type */
54
        $type = $parameter->getType();
55
        return new Parameter($parameter->getName() . $suffix, $type->getItemType());
56
    }
57
58
    /**
59
     * @param Parameter $parameter
60
     * @return string
61
     */
62
    public function getDescription(Parameter $parameter) {
63
        return '(size)';
64
    }
65
66
    /**
67
     * @param $itemParameter
68
     * @return CliField
69
     * @throws \Exception
70
     */
71
    private function getField($itemParameter) {
72
        return $this->fields->getField($itemParameter);
73
    }
74
}