StructEnum   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 43
dl 0
loc 105
ccs 52
cts 52
cp 1
rs 10
c 0
b 0
f 0
wmc 18

10 Methods

Rating   Name   Duplication   Size   Complexity  
A setModel() 0 7 3
A getEnumMethodValues() 0 11 2
A getEnumGetValidValuesAnnotationBlock() 0 11 2
A fillClassMethods() 0 3 1
A getEnumMethodGetValidValues() 0 11 2
A defineUseStatements() 0 3 1
A addClassElement() 0 3 1
A fillClassConstants() 0 6 2
A getConstantAnnotationBlock() 0 14 2
A getMethodAnnotationBlock() 0 12 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace WsdlToPhp\PackageGenerator\File;
6
7
use WsdlToPhp\PackageGenerator\Container\PhpElement\Constant as ConstantContainer;
8
use WsdlToPhp\PackageGenerator\Model\AbstractModel;
9
use WsdlToPhp\PackageGenerator\Model\Struct as StructModel;
10
use WsdlToPhp\PackageGenerator\Model\StructValue as StructValueModel;
11
use WsdlToPhp\PhpGenerator\Element\PhpAnnotation;
12
use WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock;
13
use WsdlToPhp\PhpGenerator\Element\PhpConstant;
14
use WsdlToPhp\PhpGenerator\Element\PhpMethod;
15
16
final class StructEnum extends Struct
17
{
18
    public const METHOD_VALUE_IS_VALID = 'valueIsValid';
19
    public const METHOD_GET_VALID_VALUES = 'getValidValues';
20
21 48
    public function setModel(AbstractModel $model): self
22
    {
23 48
        if ($model instanceof StructModel && !$model->isRestriction()) {
24 2
            throw new \InvalidArgumentException('Model must be a restriction containing values', __LINE__);
25
        }
26
27 46
        return parent::setModel($model);
0 ignored issues
show
Bug Best Practice introduced by
The expression return parent::setModel($model) returns the type WsdlToPhp\PackageGenerator\File\Struct which includes types incompatible with the type-hinted return WsdlToPhp\PackageGenerator\File\StructEnum.
Loading history...
28
    }
29
30 44
    protected function addClassElement(): AbstractModelFile
31
    {
32 44
        return AbstractModelFile::addClassElement();
33
    }
34
35 44
    protected function fillClassConstants(ConstantContainer $constants): void
36
    {
37
        /** @var StructModel $model */
38 44
        $model = $this->getModel();
39 44
        foreach ($model->getValues() as $value) {
40 44
            $constants->add(new PhpConstant($value->getCleanName(), $value->getValue()));
41
        }
42
    }
43
44 44
    protected function defineUseStatements(): self
45
    {
46 44
        return AbstractModelFile::defineUseStatements();
0 ignored issues
show
Bug Best Practice introduced by
The expression return WsdlToPhp\Package...::defineUseStatements() returns the type WsdlToPhp\PackageGenerator\File\AbstractModelFile which includes types incompatible with the type-hinted return WsdlToPhp\PackageGenerator\File\StructEnum.
Loading history...
47
    }
48
49 44
    protected function getConstantAnnotationBlock(PhpConstant $constant): ?PhpAnnotationBlock
50
    {
51 44
        $block = new PhpAnnotationBlock([
52 44
            sprintf('Constant for value \'%s\'', $constant->getValue()),
53 44
        ]);
54
55
        /** @var StructModel $model */
56 44
        $model = $this->getModel();
57 44
        if (($value = $model->getValue($constant->getValue())) instanceof StructValueModel) {
58 44
            $this->defineModelAnnotationsFromWsdl($block, $value);
59
        }
60 44
        $block->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, sprintf('string \'%s\'', $constant->getValue())));
61
62 44
        return $block;
63
    }
64
65 44
    protected function fillClassMethods(): void
66
    {
67 44
        $this->methods->add($this->getEnumMethodGetValidValues());
68
    }
69
70 44
    protected function getMethodAnnotationBlock(PhpMethod $method): ?PhpAnnotationBlock
71
    {
72 44
        $block = null;
73
74 44
        switch ($method->getName()) {
75 44
            case self::METHOD_GET_VALID_VALUES:
76 44
                $block = $this->getEnumGetValidValuesAnnotationBlock();
77
78 44
                break;
79
        }
80
81 44
        return $block;
82
    }
83
84 44
    protected function getEnumMethodGetValidValues(): PhpMethod
85
    {
86 44
        $method = new PhpMethod(self::METHOD_GET_VALID_VALUES, [], self::TYPE_ARRAY, PhpMethod::ACCESS_PUBLIC, false, true);
87 44
        $validValues = $this->getEnumMethodValues();
88 44
        $method->addChild('return [');
89 44
        foreach ($validValues as $validValue) {
90 44
            $method->addChild(sprintf('%s,', $method->getIndentedString($validValue, 1)));
91
        }
92 44
        $method->addChild('];');
93
94 44
        return $method;
95
    }
96
97 44
    protected function getEnumMethodValues(): array
98
    {
99 44
        $values = [];
100
101
        /** @var StructModel $model */
102 44
        $model = $this->getModel();
103 44
        foreach ($model->getValues() as $value) {
104 44
            $values[] = sprintf('self::%s', $value->getCleanName());
105
        }
106
107 44
        return $values;
108
    }
109
110 44
    protected function getEnumGetValidValuesAnnotationBlock(): PhpAnnotationBlock
111
    {
112 44
        $annotationBlock = new PhpAnnotationBlock([
113 44
            'Return allowed values',
114 44
        ]);
115 44
        foreach ($this->getEnumMethodValues() as $value) {
116 44
            $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_USES, $value));
117
        }
118 44
        $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, 'string[]'));
119
120 44
        return $annotationBlock;
121
    }
122
}
123