Completed
Push — feature/issue-91 ( f0947a )
by Mikaël
02:05
created

Rules::setFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\File\Validation;
4
5
use WsdlToPhp\PackageGenerator\Model\StructAttribute;
6
use WsdlToPhp\PhpGenerator\Element\PhpMethod;
7
use WsdlToPhp\PackageGenerator\File\AbstractModelFile;
8
use WsdlToPhp\PackageGenerator\Model\Struct;
9
use WsdlToPhp\PackageGenerator\Model\AbstractModel;
10
11
class Rules
12
{
13
    /**
14
     * @var StructAttribute
15
     */
16
    private $attribute;
17
    /**
18
     * @var AbstractModelFile
19
     */
20
    private $file;
21
    /**
22
     * @var PhpMethod
23
     */
24
    private $method;
25
    /**
26
     * @param AbstractModelFile $file
27
     * @param PhpMethod $method
28
     * @param StructAttribute $attribute
29
     */
30 174
    public function __construct(AbstractModelFile $file, PhpMethod $method, StructAttribute $attribute)
31
    {
32 174
        $this->setFile($file)->setMethod($method)->setAttribute($attribute);
33 174
    }
34
    /**
35
     * @param string $parameterName
36
     * @param bool $itemType
37
     */
38 174
    public function applyRules($parameterName, $itemType = false)
39
    {
40 174
        $this->applyRulesFromModel($this->attribute, $parameterName, $itemType);
0 ignored issues
show
Documentation introduced by
$itemType is of type boolean, but the function expects a false|string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
41 174
        if ($this->getAttribute()->isArray() && !$itemType) {
42 108
            $this->getArrayRule()->applyRule($parameterName, null, $itemType);
43 174
        } elseif ($this->getFile()->getRestrictionFromStructAttribute($this->getAttribute())) {
44 90
            $this->getEnumerationRule()->applyRule($parameterName, null, $itemType);
45 174
        } elseif ($itemType) {
46 102
            $this->getItemTypeRule()->applyRule($parameterName, null, $itemType);
47 168
        } elseif (($rule = $this->getRule($this->getFile()->getStructAttributeTypeAsPhpType($this->getAttribute()))) instanceof AbstractRule) {
48 132
            $rule->applyRule($parameterName, null, $itemType);
49 132
        }
50 174
    }
51
    /**
52
     * This method is called when an attribute has a union meta which means the attribute is of several types.
53
     * In this case, the types are currently only of type string (normally) so we add the rules according to each type
54
     * @param string $parameterName
55
     * @param string $itemType
56
     * @param string[] $unionTypes
57
     */
58 6
    protected function applyUnionRules($parameterName, $itemType, array $unionTypes)
59
    {
60 6
        foreach ($unionTypes as $type) {
61 6
            $struct = $this->getAttribute()->getGenerator()->getStruct($type);
62 6
            if ($struct instanceof Struct) {
63 6
                $this->applyRulesFromModel($struct, $parameterName, $itemType);
64 6
            }
65 6
        }
66 6
    }
67
    /**
68
     * Generic method to apply rules from current model
69
     * @param AbstractModel $model
70
     * @param string $parameterName
71
     * @param string $itemType
72
     */
73 174
    protected function applyRulesFromModel(AbstractModel $model, $parameterName, $itemType = false)
74
    {
75 174
        foreach ($model->getMeta() as $metaName => $metaValue) {
76 174
            $rule = $this->getRule($metaName);
77 174
            if ($rule instanceof AbstractRule) {
78 42
                $rule->applyRule($parameterName, $metaValue, $itemType);
0 ignored issues
show
Bug introduced by
It seems like $itemType defined by parameter $itemType on line 73 can also be of type string; however, WsdlToPhp\PackageGenerat...stractRule::applyRule() does only seem to accept boolean, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
79 174
            } elseif ($metaName === 'union' && is_array($metaValue) && count($metaValue) > 0) {
0 ignored issues
show
Unused Code Bug introduced by
The strict comparison === seems to always evaluate to false as the types of $metaName (integer) and 'union' (string) can never be identical. Maybe you want to use a loose comparison == instead?
Loading history...
80 6
                $this->applyUnionRules($parameterName, $itemType, $metaValue);
0 ignored issues
show
Bug introduced by
It seems like $itemType defined by parameter $itemType on line 73 can also be of type false; however, WsdlToPhp\PackageGenerat...ules::applyUnionRules() does only seem to accept string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
81 6
            }
82 174
        }
83 174
    }
84
    /**
85
     * @param string $metaName
86
     * @return AbstractRule
87
     */
88 174
    protected function getRule($metaName)
89
    {
90 174
        if (is_string($metaName)) {
91 174
            $className = sprintf('%s\%sRule', __NAMESPACE__, ucfirst($metaName));
92 174
            if (class_exists($className)) {
93 174
                return new $className($this);
94
            }
95 174
        }
96 174
        return null;
97
    }
98
    /**
99
     * @return ArrayRule
100
     */
101 108
    public function getArrayRule()
102
    {
103 108
        return $this->getRule('array');
104
    }
105
    /**
106
     * @return EnumerationRule
107
     */
108 90
    public function getEnumerationRule()
109
    {
110 90
        return $this->getRule('enumeration');
111
    }
112
    /**
113
     * @return ItemTypeRule
114
     */
115 102
    public function getItemTypeRule()
116
    {
117 102
        return $this->getRule('itemType');
118
    }
119
    /**
120
     * @return StructAttribute
121
     */
122 174
    public function getAttribute()
123
    {
124 174
        return $this->attribute;
125
    }
126
    /**
127
     * @param StructAttribute $attribute
128
     * @return Rules
129
     */
130 174
    public function setAttribute(StructAttribute $attribute)
131
    {
132 174
        $this->attribute = $attribute;
133 174
        return $this;
134
    }
135
    /**
136
     * @return AbstractModelFile
137
     */
138 174
    public function getFile()
139
    {
140 174
        return $this->file;
141
    }
142
    /**
143
     * @param AbstractModelFile $file
144
     * @return Rules
145
     */
146 174
    public function setFile(AbstractModelFile $file)
147
    {
148 174
        $this->file = $file;
149 174
        return $this;
150
    }
151
    /**
152
     * @return PhpMethod
153
     */
154 174
    public function getMethod()
155
    {
156 174
        return $this->method;
157
    }
158
    /**
159
     * @param PhpMethod $method
160
     * @return Rules
161
     */
162 174
    public function setMethod(PhpMethod $method)
163
    {
164 174
        $this->method = $method;
165 174
        return $this;
166
    }
167
}
168