Completed
Push — master ( eaa08c...d2fe44 )
by Mikaël
656:34 queued 656:28
created

Rules::applyRulesFromModel()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 3
cts 3
cp 1
rs 8.8571
c 0
b 0
f 0
cc 6
eloc 7
nc 4
nop 3
crap 6
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 100
     * @param StructAttribute $attribute
29
     */
30 100
    public function __construct(AbstractModelFile $file, PhpMethod $method, StructAttribute $attribute)
31 100
    {
32
        $this->setFile($file)->setMethod($method)->setAttribute($attribute);
33
    }
34
    /**
35
     * @param string $parameterName
36 100
     * @param bool $itemType
37
     */
38 100
    public function applyRules($parameterName, $itemType = false)
39 100
    {
40 100
        $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 58
        if ($this->getAttribute()->isArray() && !$itemType) {
42 8
            $this->getArrayRule()->applyRule($parameterName, null, $itemType);
43 50
        } elseif ($this->getFile()->getRestrictionFromStructAttribute($this->getAttribute())) {
44 100
            $this->getEnumerationRule()->applyRule($parameterName, null, $itemType);
45 60
        } elseif ($itemType) {
46 100
            $this->getItemTypeRule()->applyRule($parameterName, null, $itemType);
47 48
        } elseif (($rule = $this->getRule($this->getFile()->getStructAttributeTypeAsPhpType($this->getAttribute()))) instanceof AbstractRule) {
48 98
            $rule->applyRule($parameterName, null, $itemType);
49 56
        }
50 84
    }
51 72
    /**
52 36
     * This method is called when an attribute has a union meta which means the attribute is of several types.
53 100
     * 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 100
    protected function applyUnionRules($parameterName, $itemType, array $unionTypes)
59
    {
60 100
        foreach ($unionTypes as $type) {
61 100
            $struct = $this->getAttribute()->getGenerator()->getStruct($type);
62 100
            if ($struct instanceof Struct) {
63 100
                $this->applyRulesFromModel($struct, $parameterName, $itemType);
64
            }
65 50
        }
66 100
    }
67
    /**
68
     * Generic method to apply rules from current model
69
     * @param AbstractModel $model
70
     * @param string $parameterName
71 60
     * @param string $itemType
72
     */
73 60
    protected function applyRulesFromModel(AbstractModel $model, $parameterName, $itemType = false)
74
    {
75
        foreach ($model->getMeta() as $metaName => $metaValue) {
76
            $rule = $this->getRule($metaName);
77
            if ($rule instanceof AbstractRule) {
78 48
                $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
            } 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 48
                $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
            }
82
        }
83
    }
84
    /**
85 56
     * @param string $metaName
86
     * @return AbstractRule
87 56
     */
88
    protected function getRule($metaName)
89
    {
90
        if (is_string($metaName)) {
91
            $className = sprintf('%s\%sRule', __NAMESPACE__, ucfirst($metaName));
92 100
            if (class_exists($className)) {
93
                return new $className($this);
94 100
            }
95
        }
96
        return null;
97
    }
98
    /**
99
     * @return ArrayRule
100 100
     */
101
    public function getArrayRule()
102 100
    {
103 100
        return $this->getRule('array');
104
    }
105
    /**
106
     * @return EnumerationRule
107
     */
108 100
    public function getEnumerationRule()
109
    {
110 100
        return $this->getRule('enumeration');
111
    }
112
    /**
113
     * @return ItemTypeRule
114
     */
115
    public function getItemTypeRule()
116 100
    {
117
        return $this->getRule('itemType');
118 100
    }
119 100
    /**
120
     * @return StructAttribute
121
     */
122
    public function getAttribute()
123
    {
124 100
        return $this->attribute;
125
    }
126 100
    /**
127
     * @param StructAttribute $attribute
128
     * @return Rules
129
     */
130
    public function setAttribute(StructAttribute $attribute)
131
    {
132 100
        $this->attribute = $attribute;
133
        return $this;
134 100
    }
135 100
    /**
136
     * @return AbstractModelFile
137
     */
138
    public function getFile()
139
    {
140
        return $this->file;
141
    }
142
    /**
143
     * @param AbstractModelFile $file
144
     * @return Rules
145
     */
146
    public function setFile(AbstractModelFile $file)
147
    {
148
        $this->file = $file;
149
        return $this;
150
    }
151
    /**
152
     * @return PhpMethod
153
     */
154
    public function getMethod()
155
    {
156
        return $this->method;
157
    }
158
    /**
159
     * @param PhpMethod $method
160
     * @return Rules
161
     */
162
    public function setMethod(PhpMethod $method)
163
    {
164
        $this->method = $method;
165
        return $this;
166
    }
167
}
168