Passed
Push — 2.x ( 270e0d...5f9cdf )
by Mikaël
24:20
created

StructEnum::getEnumMethodValueIsValid()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 7
ccs 6
cts 6
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\File;
4
5
use WsdlToPhp\PackageGenerator\Model\AbstractModel;
6
use WsdlToPhp\PackageGenerator\Model\Struct as StructModel;
7
use WsdlToPhp\PackageGenerator\Model\StructValue as StructValueModel;
8
use WsdlToPhp\PackageGenerator\Container\PhpElement\Constant as ConstantContainer;
9
use WsdlToPhp\PhpGenerator\Element\PhpConstant;
10
use WsdlToPhp\PhpGenerator\Element\PhpMethod;
11
use WsdlToPhp\PhpGenerator\Element\PhpAnnotation;
12
use WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock;
13
14
class StructEnum extends Struct
15
{
16
    /**
17
     * @var string
18
     */
19
    const METHOD_VALUE_IS_VALID = 'valueIsValid';
20
    /**
21
     * @var string
22
     */
23
    const METHOD_GET_VALID_VALUES = 'getValidValues';
24
    /**
25
     * @param ConstantContainer $constants
26
     */
27 126
    protected function getClassConstants(ConstantContainer $constants)
28
    {
29 126
        foreach ($this->getModel()->getValues() as $value) {
30 126
            $constants->add(new PhpConstant($value->getCleanName(), $value->getValue()));
31 63
        }
32 126
    }
33
    /**
34
     * @param PhpConstant $constant
35
     * @return PhpAnnotationBlock
36
     */
37 126
    protected function getConstantAnnotationBlock(PhpConstant $constant)
38
    {
39 126
        $block = new PhpAnnotationBlock([
40 126
            sprintf('Constant for value \'%s\'', $constant->getValue()),
41 63
        ]);
42 126
        if (($value = $this->getModel()->getValue($constant->getValue())) instanceof StructValueModel) {
43 126
            $this->defineModelAnnotationsFromWsdl($block, $value);
44 63
        }
45 126
        $block->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, sprintf('string \'%s\'', $constant->getValue())));
46 126
        return $block;
47
    }
48 126
    protected function fillClassMethods()
49
    {
50 126
        $this->methods->add($this->getEnumMethodValueIsValid())->add($this->getEnumMethodGetValidValues());
51 126
    }
52
    /**
53
     * @param PhpMethod $method
54
     * @return PhpAnnotationBlock|null
55
     */
56 126
    protected function getMethodAnnotationBlock(PhpMethod $method)
57
    {
58 126
        $block = null;
59 126
        switch ($method->getName()) {
60 126
            case self::METHOD_GET_VALID_VALUES:
61 126
                $block = $this->getEnumGetValidValuesAnnotationBlock();
62 126
                break;
63 126
            case self::METHOD_VALUE_IS_VALID:
64 126
                $block = $this->getEnumValueIsValidAnnotationBlock();
65 126
                break;
66 63
        }
67 126
        return $block;
68
    }
69
    /**
70
     * @return PhpMethod
71
     */
72 126
    protected function getEnumMethodValueIsValid()
73
    {
74 126
        $method = new PhpMethod(self::METHOD_VALUE_IS_VALID, [
75 126
            'value',
76 126
        ], PhpMethod::ACCESS_PUBLIC, false, true);
77 126
        $method->addChild(sprintf('return ($value === null) || in_array($value, self::%s(), true);', self::METHOD_GET_VALID_VALUES));
78 126
        return $method;
79
    }
80
    /**
81
     * @return PhpMethod
82
     */
83 126
    protected function getEnumMethodGetValidValues()
84
    {
85 126
        $method = new PhpMethod(self::METHOD_GET_VALID_VALUES, [], PhpMethod::ACCESS_PUBLIC, false, true);
86 126
        $validValues = $this->getEnumMethodValues();
87 126
        $method->addChild('return array(');
88 126
        foreach ($validValues as $validValue) {
89 126
            $method->addChild(sprintf('%s,', $method->getIndentedString($validValue, 1)));
90 63
        }
91 126
        $method->addChild(');');
92 126
        return $method;
93
    }
94
    /**
95
     * @return string[]
96
     */
97 126
    protected function getEnumMethodValues()
98
    {
99 126
        $values = [];
100 126
        foreach ($this->getModel()->getValues() as $value) {
101 126
            $values[] = sprintf('self::%s', $value->getCleanName());
102 63
        }
103 126
        return $values;
104
    }
105
    /**
106
     * @return PhpAnnotationBlock
107
     */
108 126
    protected function getEnumValueIsValidAnnotationBlock()
109
    {
110 126
        $annotationBlock = new PhpAnnotationBlock([
111 126
            'Return true if value is allowed',
112 63
        ]);
113 126
        $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_USES, sprintf('self::%s()', self::METHOD_GET_VALID_VALUES)))->addChild(new PhpAnnotation(self::ANNOTATION_PARAM, 'mixed $value value'))->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, 'bool true|false'));
114 126
        return $annotationBlock;
115
    }
116
    /**
117
     * @return PhpAnnotationBlock
118
     */
119 126
    protected function getEnumGetValidValuesAnnotationBlock()
120
    {
121 126
        $annotationBlock = new PhpAnnotationBlock([
122 126
            'Return allowed values',
123 63
        ]);
124 126
        foreach ($this->getEnumMethodValues() as $value) {
125 126
            $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_USES, $value));
126 63
        }
127 126
        $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, 'string[]'));
128 126
        return $annotationBlock;
129
    }
130
    /**
131
     * @see \WsdlToPhp\PackageGenerator\File\AbstractModelFile::setModel()
132
     * @throws \InvalidArgumentException
133
     * @param AbstractModel $model
134
     * @return StructArray
135
     */
136 138
    public function setModel(AbstractModel $model)
137
    {
138 138
        if ($model instanceof StructModel && !$model->isRestriction()) {
139 6
            throw new \InvalidArgumentException('Model must be a restriction containing values', __LINE__);
140
        }
141 132
        return parent::setModel($model);
142
    }
143
}
144