Completed
Pull Request — master (#21)
by Matt
03:01
created

functions.php ➔ compare()   C

Complexity

Conditions 14
Paths 21

Size

Total Lines 31
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 38.5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 14
eloc 25
c 1
b 0
f 0
nc 21
nop 3
dl 0
loc 31
ccs 12
cts 24
cp 0.5
crap 38.5
rs 5.0864

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
namespace League\JsonGuard;
4
5
/**
6
 * @param string $json
7
 * @param bool   $assoc
8
 * @param int    $depth
9
 * @param int    $options
10
 * @return mixed
11
 * @throws \InvalidArgumentException
12
 */
13
function json_decode($json, $assoc = false, $depth = 512, $options = 0)
14
{
15 28
    $data = \json_decode($json, $assoc, $depth, $options);
16
17 28
    if (json_last_error() !== JSON_ERROR_NONE) {
18
        throw new \InvalidArgumentException(sprintf('Invalid JSON: %s', json_last_error_msg()));
19
    }
20
21 28
    return $data;
22
}
23
24
/**
25
 * @param $string
26
 * @return int
27
 */
28
function strlen($string)
29
{
30 10
    if (extension_loaded('intl')) {
31 10
        return grapheme_strlen($string);
32
    }
33
34
    if (extension_loaded('mbstring')) {
35
        return mb_strlen($string, mb_detect_encoding($string));
36
    }
37
38
    return strlen($string);
39
}
40
41
/**
42
 * Returns the string representation of a value.
43
 *
44
 * @param mixed $value
45
 * @return string
46
 */
47
function as_string($value)
48
{
49 62
    if (is_string($value)) {
50 32
        return $value;
51
    }
52
53 50
    if (is_int($value)) {
54 40
        return (string)$value;
55
    }
56
57 28
    if (is_bool($value)) {
58 8
        return $value ? '<TRUE>' : '<FALSE>';
59
    }
60
61 24
    if (is_object($value)) {
62 6
        return get_class($value);
63
    }
64
65 24
    if (is_array($value)) {
66 8
        return '<ARRAY>';
67
    }
68
69 20
    if (is_resource($value)) {
70
        return '<RESOURCE>';
71
    }
72
73 20
    if (is_null($value)) {
74 6
        return '<NULL>';
75
    }
76
77 16
    return '<UNKNOWN>';
78
}
79
80
/**
81
 * Get the properties matching $pattern from the $data.
82
 *
83
 * @param string       $pattern
84
 * @param array|object $data
85
 * @return array
86
 */
87
function properties_matching_pattern($pattern, $data)
88
{
89
    // If an object is supplied, extract an array of the property names.
90 6
    if (is_object($data)) {
91 6
        $data = array_keys(get_object_vars($data));
92 6
    }
93
94 6
    return preg_grep(delimit_pattern($pattern), $data);
95
}
96
97
/**
98
 * Delimit a regular expression pattern.
99
 *
100
 * The regular expression syntax used for JSON schema is ECMA 262, from Javascript,
101
 * and does not use delimiters.  Since the PCRE functions do, this function will
102
 * delimit a pattern and escape the delimiter if found in the pattern.
103
 *
104
 * @see http://json-schema.org/latest/json-schema-validation.html#anchor6
105
 * @see http://php.net/manual/en/regexp.reference.delimiters.php
106
 *
107
 * @param string $pattern
108
 *
109
 * @return string
110
 */
111
function delimit_pattern($pattern)
112
{
113 8
    return '/' . str_replace('/', '\\/', $pattern) . '/';
114
}
115
116
/**
117
 * Escape a JSON Pointer.
118
 *
119
 * @param  string $pointer
120
 * @return string
121
 */
122
function escape_pointer($pointer)
123
{
124 62
    $pointer = str_replace('~', '~0', $pointer);
125 62
    return str_replace('/', '~1', $pointer);
126
}
127
128
/**
129
 * Compare two numbers or numeric strings.
130
 *
131
 * @param  string|int $leftOperand
132
 * @param  string $operator         one of : '>', '>=', '=', '<', '<='.
133
 * @param  string|int $rightOperand
134
 * @return bool
135
 */
136
function compare($leftOperand, $operator, $rightOperand)
137
{
138 62
    if (!function_exists('bccomp')) {
139
        switch ($operator) {
140
            case '>':
141
                return $leftOperand > $rightOperand;
142
            case '>=':
143
                return $leftOperand >= $rightOperand;
144
            case '=':
145
                return $leftOperand >= $rightOperand;
146
            case '<':
147
                return $leftOperand < $rightOperand;
148
            case '<=':
149
                return $leftOperand <= $rightOperand;
150
        }
151
    }
152
153 62
    $result = bccomp($leftOperand, $rightOperand, 5);
154
    switch ($operator) {
155 62
        case '>':
156 14
            return $result === 1;
157 52
        case '>=':
158 24
            return $result === 0 || $result === 1;
159 32
        case '=':
160 8
            return $result === 0;
161 24
        case '<':
162 12
            return $result === -1;
163 16
        case '<=':
164 16
            return $result === 0 || $result === -1;
165
    }
166
}
167