ErrorTrait::errorCall()   B
last analyzed

Complexity

Conditions 10
Paths 12

Size

Total Lines 26
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 10.0454

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 13
c 1
b 0
f 0
nc 12
nop 2
dl 0
loc 26
ccs 12
cts 13
cp 0.9231
crap 10.0454
rs 7.6666

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * DronePHP (http://www.dronephp.com)
4
 *
5
 * @link      http://github.com/Pleets/DronePHP
6
 * @copyright Copyright (c) 2016-2018 Pleets. (http://www.pleets.org)
7
 * @license   http://www.dronephp.com/license
8
 * @author    Darío Rivera <[email protected]>
9
 */
10
11
namespace Drone\Error;
12
13
/**
14
 * ErrorTrait trait
15
 *
16
 * Standard error management for some classes
17
 */
18
trait ErrorTrait
19
{
20
    /**
21
     * Common errors
22
     *
23
     * @var array
24
     */
25
    protected $standardErrors = [
26
27
        # File errros
28
        1 => 'Failed to open stream \'%file%\', Permission Denied!',
29
        2 => 'No such file or directory \'%file%\'',
30
        3 => 'File exists \'%file%\'',
31
        4 => 'Stream \'%file%\' is Not a directory',
32
33
        # JSON errors
34
        10 => 'Failed to decode JSON file \'%file%\'',
35
        11 => 'Failed to encode JSON file \'%file%\'',
36
37
        # Database related errors
38
        20 => 'The transaction was already started',
39
        21 => 'The transaction has not been started',
40
        22 => 'Transaction cannot be empty',
41
    ];
42
43
    /**
44
     * Failure messages
45
     *
46
     * This member stores all failure messages as an array of key/value pairs.
47
     *
48
     * key:   The the code of the error (usually in Errno class). Also the ERROR_CONSTANT.
49
     * value: The error message.
50
     *
51
     * If the key is not an integer, the error is not in Errno class.
52
     *
53
     * @var array
54
     */
55
    protected $errors = [];
56
57
    /**
58
     * Returns an array with all failure messages
59
     *
60
     * @return array
61
     */
62 3
    public function getErrors()
63
    {
64 3
        return $this->errors;
65
    }
66
67
    /**
68
     * Returns true if there is at least one error or false if not
69
     *
70
     * @return array
71
     */
72 1
    public function hasErrors()
73
    {
74 1
        return (bool) count($this->errors);
0 ignored issues
show
Bug Best Practice introduced by
The expression return (bool)count($this->errors) returns the type boolean which is incompatible with the documented return type array.
Loading history...
75
    }
76
77
    /**
78
     * Adds an error
79
     *
80
     * When the error is standard (i.e. exists in Errno class) the behavior is as follow:
81
     * - _error(int ERROR_CONSTANT): Adds a standard error without replace the wildcard
82
     * - _error(int ERROR_CONSTANT, string $message): Adds a standard error replacing the wildcard
83
     *
84
     * When the error is non-standard (i.e. is not a member of Errno class) the behavior is as follow:
85
     * - _error(int $code, string $message): Adds a non-standard error
86
     * - _error(string $message): Adds a non-standard error creating a generated base64 code
87
     *
88
     * @param integer|string $code
89
     * @param string         $message
90
     *
91
     * @return null
92
     */
93 12
    private function errorCall($code, $message = null)
94
    {
95 12
        if (!is_null($code) && !is_integer($code) && !is_string($code)) {
0 ignored issues
show
introduced by
The condition is_null($code) is always false.
Loading history...
introduced by
The condition is_string($code) is always true.
Loading history...
96
            throw new \InvalidArgumentException("Invalid type given. Integer or string expected");
97
        }
98
99 12
        if (is_null($code)) {
0 ignored issues
show
introduced by
The condition is_null($code) is always false.
Loading history...
100 1
            $code = preg_replace('/=|\/|\+/', "", base64_encode($message));
101
        } else {
102 11
            if (!array_key_exists($code, $this->standardErrors) && empty($message)) {
103
                /*
104
                 * Non-standard errors must have a message to describe the error, make sure
105
                 * you execute the error() method with a message as the second parameter.
106
                 */
107 1
                throw new \LogicException('The message does not be empty in non-standard errors!');
108
            }
109
        }
110
111 11
        if (!array_key_exists($code, $this->errors)) {
112 11
            $this->errors[$code] = (array_key_exists($code, $this->standardErrors))
113
                ?
114 3
                    is_null($message)
115 1
                        ? preg_replace('/\s\'%[a-zA-Z]*%\'/', $message, $this->standardErrors[$code])
116
                        # if $message is not null it will replace the %file% wildcard
117 3
                        : preg_replace('/%[a-zA-Z]*%/', $message, $this->standardErrors[$code])
118 8
                : $message;
119
        }
120 11
    }
121
122 12
    public function __call($method, $arguments)
123
    {
124 12
        if ($method == 'error') {
125 12
            switch (count($arguments)) {
126 12
                case 1:
127 3
                    if (is_integer($arguments[0])) {
128 2
                        return call_user_func([$this, 'errorCall'], array_shift($arguments));
129
                    } else {
130 1
                        return call_user_func([$this, 'errorCall'], null, array_shift($arguments));
131
                    }
132
                    break;
133 10
                case 2:
134 10
                    return call_user_func([$this, 'errorCall'], $arguments[0], $arguments[1]);
135
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
136
            }
137
        }
138
    }
139
}
140