Passed
Push — 2.x ( bef6c0...34f135 )
by Mikaël
03:54
created

StructEnum::setModel()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 3

Importance

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