Passed
Push — dev ( b88f8d...327f00 )
by Marcin
07:42
created
src/Validator.php 1 patch
Indentation   +173 added lines, -173 removed lines patch added patch discarded remove patch
@@ -15,186 +15,186 @@
 block discarded – undo
15 15
  */
16 16
 class Validator
17 17
 {
18
-    /** @var string */
19
-    public const TYPE_STRING = 'string';
18
+	/** @var string */
19
+	public const TYPE_STRING = 'string';
20 20
 
21
-    /** @var string */
22
-    public const TYPE_INTEGER = 'integer';
21
+	/** @var string */
22
+	public const TYPE_INTEGER = 'integer';
23 23
 
24
-    /** @var string */
25
-    public const TYPE_BOOL = 'boolean';
24
+	/** @var string */
25
+	public const TYPE_BOOL = 'boolean';
26 26
 
27
-    /** @var string */
28
-    public const TYPE_ARRAY = 'array';
27
+	/** @var string */
28
+	public const TYPE_ARRAY = 'array';
29 29
 
30
-    /** @var string */
31
-    public const TYPE_OBJECT = 'object';
30
+	/** @var string */
31
+	public const TYPE_OBJECT = 'object';
32 32
 
33 33
 	/** @var string */
34 34
 	public const TYPE_DOUBLE = 'double';
35 35
 
36 36
 	/** @var string */
37
-    public const TYPE_NULL = 'NULL';
38
-
39
-    /**
40
-     * Checks if given $val is of type boolean
41
-     *
42
-     * @param string $key Name of the key to be used if exception is thrown.
43
-     * @param mixed  $var Variable to be asserted.
44
-     *
45
-     * @return void
46
-     *
47
-     * @throws \InvalidArgumentException
48
-     */
49
-    public static function assertIsBool(string $key, $var): void
50
-    {
51
-        self::assertIsType($key, $var, [self::TYPE_BOOL]);
52
-    }
53
-
54
-    /**
55
-     * Checks if given $val is of type integer
56
-     *
57
-     * @param string $key Name of the key to be used if exception is thrown.
58
-     * @param mixed  $var Variable to be asserted.
59
-     *
60
-     * @return void
61
-     *
62
-     * @throws \InvalidArgumentException
63
-     */
64
-    public static function assertIsInt(string $key, $var): void
65
-    {
66
-        self::assertIsType($key, $var, [self::TYPE_INTEGER]);
67
-    }
68
-
69
-    /**
70
-     * Checks if given $val is of type array
71
-     *
72
-     * @param string $key Name of the key to be used if exception is thrown.
73
-     * @param mixed  $var Variable to be asserted.
74
-     *
75
-     * @return void
76
-     *
77
-     * @throws \InvalidArgumentException
78
-     */
79
-    public static function assertIsArray(string $key, $var): void
80
-    {
81
-        self::assertIsType($key, $var, [self::TYPE_ARRAY]);
82
-    }
83
-
84
-    /**
85
-     * Checks if given $val is an object
86
-     *
87
-     * @param string $key Name of the key to be used if exception is thrown.
88
-     * @param mixed  $var Variable to be asserted.
89
-     *
90
-     * @return void
91
-     *
92
-     * @throws \InvalidArgumentException
93
-     */
94
-    public static function assertIsObject(string $key, $var): void
95
-    {
96
-        self::assertIsType($key, $var, [self::TYPE_OBJECT]);
97
-    }
98
-
99
-    /**
100
-     * Checks if given $val is of type string
101
-     *
102
-     * @param string $name Label or name of the variable to be used in exception message (if thrown).
103
-     * @param mixed  $var  Variable to be asserted.
104
-     *
105
-     * @return void
106
-     *
107
-     * @throws \InvalidArgumentException
108
-     */
109
-    public static function assertIsString(string $name, $var): void
110
-    {
111
-        self::assertIsType($name, $var, [self::TYPE_STRING]);
112
-    }
113
-
114
-    /**
115
-     * @param string $name Label or name of the variable to be used in exception message (if thrown).
116
-     * @param mixed  $var  Variable to be asserted.
117
-     * @param int    $min  Min allowed value (inclusive)
118
-     * @param int    $max  Max allowed value (inclusive)
119
-     *
120
-     * @return void
121
-     *
122
-     * @throws \InvalidArgumentException
123
-     * @throws \RuntimeException
124
-     */
125
-    public static function assertIsIntRange(string $name, $var, int $min, int $max): void
126
-    {
127
-        self::assertIsInt($name, $var);
128
-
129
-        if ($min > $max) {
130
-            throw new \RuntimeException(
131
-                \sprintf('%s: Invalid range for "%s". Ensure bound values are not swapped.', __FUNCTION__, $name));
132
-        }
133
-
134
-        if (($min > $var) || ($var > $max)) {
135
-            throw new \InvalidArgumentException(
136
-                \sprintf('Invalid value of "%s" (%d). Must be between %d-%d inclusive.', $name, $var, $min, $max));
137
-        }
138
-    }
139
-
140
-    /**
141
-     * Checks if $item (of name $key) is of type that is include in $allowed_types.
142
-     *
143
-     * @param string $name          Label or name of the variable to be used in exception message (if thrown).
144
-     * @param mixed  $var           Variable to be asserted.
145
-     * @param array  $allowed_types Array of allowed types for $var, i.e. [Type::INTEGER]
146
-     *
147
-     * @return void
148
-     *
149
-     * @throws \InvalidArgumentException
150
-     */
151
-    public static function assertIsType(string $name, $var, array $allowed_types): void
152
-    {
153
-        $type = \gettype($var);
154
-        if (!\in_array($type, $allowed_types, true)) {
155
-            throw new \InvalidArgumentException(
156
-                \sprintf('"%s" must be one of allowed types: %s (%s given)',
157
-                    $name, implode(', ', $allowed_types), \gettype($var))
158
-            );
159
-        }
160
-    }
161
-
162
-    /**
163
-     * Ensures given $http_code is valid code for error response.
164
-     *
165
-     * @param int $http_code
166
-     */
167
-    public static function assertErrorHttpCode(int $http_code): void
168
-    {
169
-        self::assertIsInt('http_code', $http_code);
170
-        self::assertIsIntRange('http_code', $http_code,
171
-            ResponseBuilder::ERROR_HTTP_CODE_MIN, ResponseBuilder::ERROR_HTTP_CODE_MAX);
172
-    }
173
-
174
-    /**
175
-     * Ensures given $http_code is valid for response indicating sucessful operation.
176
-     *
177
-     * @param int $http_code
178
-     */
179
-    public static function assertOkHttpCode(int $http_code): void
180
-    {
181
-        self::assertIsInt('http_code', $http_code);
182
-        self::assertIsIntRange('http_code', $http_code, 200, 299);
183
-    }
184
-
185
-    /**
186
-     * Ensures $obj is instance of $cls.
187
-     *
188
-     * @param string $name
189
-     * @param object $obj
190
-     * @param string $cls
191
-     */
192
-    public static function assertInstanceOf(string $name, object $obj, string $cls): void
193
-    {
194
-        if (!($obj instanceof $cls)) {
195
-            throw new \InvalidArgumentException(
196
-                \sprintf('"%s" must be instance of "%s".', $name, $cls)
197
-            );
198
-        }
199
-    }
37
+	public const TYPE_NULL = 'NULL';
38
+
39
+	/**
40
+	 * Checks if given $val is of type boolean
41
+	 *
42
+	 * @param string $key Name of the key to be used if exception is thrown.
43
+	 * @param mixed  $var Variable to be asserted.
44
+	 *
45
+	 * @return void
46
+	 *
47
+	 * @throws \InvalidArgumentException
48
+	 */
49
+	public static function assertIsBool(string $key, $var): void
50
+	{
51
+		self::assertIsType($key, $var, [self::TYPE_BOOL]);
52
+	}
53
+
54
+	/**
55
+	 * Checks if given $val is of type integer
56
+	 *
57
+	 * @param string $key Name of the key to be used if exception is thrown.
58
+	 * @param mixed  $var Variable to be asserted.
59
+	 *
60
+	 * @return void
61
+	 *
62
+	 * @throws \InvalidArgumentException
63
+	 */
64
+	public static function assertIsInt(string $key, $var): void
65
+	{
66
+		self::assertIsType($key, $var, [self::TYPE_INTEGER]);
67
+	}
68
+
69
+	/**
70
+	 * Checks if given $val is of type array
71
+	 *
72
+	 * @param string $key Name of the key to be used if exception is thrown.
73
+	 * @param mixed  $var Variable to be asserted.
74
+	 *
75
+	 * @return void
76
+	 *
77
+	 * @throws \InvalidArgumentException
78
+	 */
79
+	public static function assertIsArray(string $key, $var): void
80
+	{
81
+		self::assertIsType($key, $var, [self::TYPE_ARRAY]);
82
+	}
83
+
84
+	/**
85
+	 * Checks if given $val is an object
86
+	 *
87
+	 * @param string $key Name of the key to be used if exception is thrown.
88
+	 * @param mixed  $var Variable to be asserted.
89
+	 *
90
+	 * @return void
91
+	 *
92
+	 * @throws \InvalidArgumentException
93
+	 */
94
+	public static function assertIsObject(string $key, $var): void
95
+	{
96
+		self::assertIsType($key, $var, [self::TYPE_OBJECT]);
97
+	}
98
+
99
+	/**
100
+	 * Checks if given $val is of type string
101
+	 *
102
+	 * @param string $name Label or name of the variable to be used in exception message (if thrown).
103
+	 * @param mixed  $var  Variable to be asserted.
104
+	 *
105
+	 * @return void
106
+	 *
107
+	 * @throws \InvalidArgumentException
108
+	 */
109
+	public static function assertIsString(string $name, $var): void
110
+	{
111
+		self::assertIsType($name, $var, [self::TYPE_STRING]);
112
+	}
113
+
114
+	/**
115
+	 * @param string $name Label or name of the variable to be used in exception message (if thrown).
116
+	 * @param mixed  $var  Variable to be asserted.
117
+	 * @param int    $min  Min allowed value (inclusive)
118
+	 * @param int    $max  Max allowed value (inclusive)
119
+	 *
120
+	 * @return void
121
+	 *
122
+	 * @throws \InvalidArgumentException
123
+	 * @throws \RuntimeException
124
+	 */
125
+	public static function assertIsIntRange(string $name, $var, int $min, int $max): void
126
+	{
127
+		self::assertIsInt($name, $var);
128
+
129
+		if ($min > $max) {
130
+			throw new \RuntimeException(
131
+				\sprintf('%s: Invalid range for "%s". Ensure bound values are not swapped.', __FUNCTION__, $name));
132
+		}
133
+
134
+		if (($min > $var) || ($var > $max)) {
135
+			throw new \InvalidArgumentException(
136
+				\sprintf('Invalid value of "%s" (%d). Must be between %d-%d inclusive.', $name, $var, $min, $max));
137
+		}
138
+	}
139
+
140
+	/**
141
+	 * Checks if $item (of name $key) is of type that is include in $allowed_types.
142
+	 *
143
+	 * @param string $name          Label or name of the variable to be used in exception message (if thrown).
144
+	 * @param mixed  $var           Variable to be asserted.
145
+	 * @param array  $allowed_types Array of allowed types for $var, i.e. [Type::INTEGER]
146
+	 *
147
+	 * @return void
148
+	 *
149
+	 * @throws \InvalidArgumentException
150
+	 */
151
+	public static function assertIsType(string $name, $var, array $allowed_types): void
152
+	{
153
+		$type = \gettype($var);
154
+		if (!\in_array($type, $allowed_types, true)) {
155
+			throw new \InvalidArgumentException(
156
+				\sprintf('"%s" must be one of allowed types: %s (%s given)',
157
+					$name, implode(', ', $allowed_types), \gettype($var))
158
+			);
159
+		}
160
+	}
161
+
162
+	/**
163
+	 * Ensures given $http_code is valid code for error response.
164
+	 *
165
+	 * @param int $http_code
166
+	 */
167
+	public static function assertErrorHttpCode(int $http_code): void
168
+	{
169
+		self::assertIsInt('http_code', $http_code);
170
+		self::assertIsIntRange('http_code', $http_code,
171
+			ResponseBuilder::ERROR_HTTP_CODE_MIN, ResponseBuilder::ERROR_HTTP_CODE_MAX);
172
+	}
173
+
174
+	/**
175
+	 * Ensures given $http_code is valid for response indicating sucessful operation.
176
+	 *
177
+	 * @param int $http_code
178
+	 */
179
+	public static function assertOkHttpCode(int $http_code): void
180
+	{
181
+		self::assertIsInt('http_code', $http_code);
182
+		self::assertIsIntRange('http_code', $http_code, 200, 299);
183
+	}
184
+
185
+	/**
186
+	 * Ensures $obj is instance of $cls.
187
+	 *
188
+	 * @param string $name
189
+	 * @param object $obj
190
+	 * @param string $cls
191
+	 */
192
+	public static function assertInstanceOf(string $name, object $obj, string $cls): void
193
+	{
194
+		if (!($obj instanceof $cls)) {
195
+			throw new \InvalidArgumentException(
196
+				\sprintf('"%s" must be instance of "%s".', $name, $cls)
197
+			);
198
+		}
199
+	}
200 200
 }
Please login to merge, or discard this patch.
src/ResponseBuilder.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -84,7 +84,7 @@  discard block
 block discarded – undo
84 84
 	 * @return HttpResponse
85 85
 	 */
86 86
 	public static function success($data = null, $api_code = null, array $placeholders = null,
87
-	                               int $http_code = null, int $json_opts = null): HttpResponse
87
+								   int $http_code = null, int $json_opts = null): HttpResponse
88 88
 	{
89 89
 		return static::asSuccess($api_code)
90 90
 			->withData($data)
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
 	 * @return HttpResponse
113 113
 	 */
114 114
 	public static function error(int $api_code, array $placeholders = null, $data = null, int $http_code = null,
115
-	                             int $json_opts = null): HttpResponse
115
+								 int $json_opts = null): HttpResponse
116 116
 	{
117 117
 		return static::asError($api_code)
118 118
 			->withPlaceholders($placeholders)
@@ -161,7 +161,7 @@  discard block
 block discarded – undo
161 161
 	public function withHttpCode(int $http_code = null): self
162 162
 	{
163 163
 		Validator::assertIsType('http_code', $http_code, [Type::INTEGER,
164
-		                                                  Type::NULL]);
164
+														  Type::NULL]);
165 165
 		$this->http_code = $http_code;
166 166
 
167 167
 		return $this;
@@ -175,8 +175,8 @@  discard block
 block discarded – undo
175 175
 	public function withData($data = null): self
176 176
 	{
177 177
 		Validator::assertIsType('data', $data, [Type::ARRAY,
178
-		                                        Type::OBJECT,
179
-		                                        Type::NULL]);
178
+												Type::OBJECT,
179
+												Type::NULL]);
180 180
 		$this->data = $data;
181 181
 
182 182
 		return $this;
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
 	public function withJsonOptions(int $json_opts = null): self
191 191
 	{
192 192
 		Validator::assertIsType('json_opts', $json_opts, [Type::INTEGER,
193
-		                                                  Type::NULL]);
193
+														  Type::NULL]);
194 194
 		$this->json_opts = $json_opts;
195 195
 
196 196
 		return $this;
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
 	public function withDebugData(array $debug_data = null): self
205 205
 	{
206 206
 		Validator::assertIsType('$debug_data', $debug_data, [Type::ARRAY,
207
-		                                                     Type::NULL]);
207
+															 Type::NULL]);
208 208
 		$this->debug_data = $debug_data;
209 209
 
210 210
 		return $this;
@@ -218,7 +218,7 @@  discard block
 block discarded – undo
218 218
 	public function withMessage(string $msg = null): self
219 219
 	{
220 220
 		Validator::assertIsType('message', $msg, [Type::STRING,
221
-		                                          Type::NULL]);
221
+												  Type::NULL]);
222 222
 		$this->message = $msg;
223 223
 
224 224
 		return $this;
@@ -305,8 +305,8 @@  discard block
 block discarded – undo
305 305
 	 * @noinspection PhpTooManyParametersInspection
306 306
 	 */
307 307
 	protected function make(bool $success, int $api_code, $msg_or_api_code, $data = null,
308
-	                        int $http_code = null, array $placeholders = null, array $http_headers = null,
309
-	                        int $json_opts = null, array $debug_data = null): HttpResponse
308
+							int $http_code = null, array $placeholders = null, array $http_headers = null,
309
+							int $json_opts = null, array $debug_data = null): HttpResponse
310 310
 	{
311 311
 		$http_headers = $http_headers ?? [];
312 312
 		$http_code = $http_code ?? ($success ? ResponseBuilder::DEFAULT_HTTP_CODE_OK : ResponseBuilder::DEFAULT_HTTP_CODE_ERROR);
@@ -345,8 +345,8 @@  discard block
 block discarded – undo
345 345
 	 * @noinspection PhpTooManyParametersInspection
346 346
 	 */
347 347
 	protected function buildResponse(bool $success, int $api_code,
348
-	                                 $msg_or_api_code, array $placeholders = null,
349
-	                                 $data = null, array $debug_data = null): array
348
+									 $msg_or_api_code, array $placeholders = null,
349
+									 $data = null, array $debug_data = null): array
350 350
 	{
351 351
 		// ensure $data is either @null, array or object of class with configured mapping.
352 352
 		$data = (new Converter())->convert($data);
Please login to merge, or discard this patch.
src/Converter.php 1 patch
Indentation   +217 added lines, -217 removed lines patch added patch discarded remove patch
@@ -23,27 +23,27 @@  discard block
 block discarded – undo
23 23
  */
24 24
 class Converter
25 25
 {
26
-    /** @var array */
27
-    protected $classes = [];
26
+	/** @var array */
27
+	protected $classes = [];
28 28
 
29
-    /** @var array */
30
-    protected $primitives = [];
29
+	/** @var array */
30
+	protected $primitives = [];
31 31
 
32
-    /** @var bool */
33
-    protected $debug_enabled = false;
32
+	/** @var bool */
33
+	protected $debug_enabled = false;
34 34
 
35
-    /**
36
-     * Converter constructor.
37
-     *
38
-     * @throws \RuntimeException
39
-     */
40
-    public function __construct()
41
-    {
42
-        $this->classes = static::getClassesMapping() ?? [];
43
-        $this->primitives = static::getPrimitivesMapping() ?? [];
35
+	/**
36
+	 * Converter constructor.
37
+	 *
38
+	 * @throws \RuntimeException
39
+	 */
40
+	public function __construct()
41
+	{
42
+		$this->classes = static::getClassesMapping() ?? [];
43
+		$this->primitives = static::getPrimitivesMapping() ?? [];
44 44
 
45
-	    $this->debug_enabled = Config::get(ResponseBuilder::CONF_KEY_CONVERTER_DEBUG_KEY, false);
46
-    }
45
+		$this->debug_enabled = Config::get(ResponseBuilder::CONF_KEY_CONVERTER_DEBUG_KEY, false);
46
+	}
47 47
 
48 48
 	/**
49 49
 	 * Returns "converter/primitives" entry for given primitive object or throws exception if no config found.
@@ -56,116 +56,116 @@  discard block
 block discarded – undo
56 56
 	 *
57 57
 	 * @throws \InvalidArgumentException
58 58
 	 */
59
-    protected function getPrimitiveMappingConfigOrThrow($data): array
60
-    {
61
-	    $result = null;
62
-
63
-	    $type = \gettype($data);
64
-	    $result = $this->primitives[ $type ] ?? null;
65
-	    if ($result === null) {
66
-		    throw new \InvalidArgumentException(sprintf('No data conversion mapping configured for "%s" primitive.', $type));
67
-	    }
68
-
69
-	    if ($this->debug_enabled) {
70
-		    Log::debug(__CLASS__ . ": Converting primitive type of '{$type}' to data node '{$result[ResponseBuilder::KEY_KEY]}'.");
71
-	    }
72
-
73
-	    return $result;
74
-    }
75
-
76
-    /**
77
-     * Returns "converter/map" mapping configured for given $data object class or throws exception if not found.
78
-     * Throws \RuntimeException if there's no config "classes" mapping entry for this object configured.
79
-     * Throws \InvalidArgumentException if No data conversion mapping configured for given class.
80
-     *
81
-     * @param object $data Object to get config for.
82
-     *
83
-     * @return array
84
-     *
85
-     * @throws \InvalidArgumentException
86
-     */
87
-    protected function getClassMappingConfigOrThrow(object $data): array
88
-    {
89
-        $result = null;
90
-        $debug_result = '';
91
-
92
-        // check for exact class name match...
93
-        $cls = \get_class($data);
94
-        if (\is_string($cls)) {
95
-	        if (\array_key_exists($cls, $this->classes)) {
96
-		        $result = $this->classes[ $cls ];
97
-		        $debug_result = 'exact config match';
98
-	        } else {
99
-		        // no exact match, then lets try with `instanceof`
100
-		        foreach (\array_keys($this->classes) as $class_name) {
101
-			        if ($data instanceof $class_name) {
102
-				        $result = $this->classes[ $class_name ];
103
-				        $debug_result = "subclass of {$class_name}";
104
-				        break;
105
-			        }
106
-		        }
107
-	        }
108
-        }
109
-
110
-        if ($result === null) {
111
-            throw new \InvalidArgumentException(sprintf('No data conversion mapping configured for "%s" class.', $cls));
112
-        }
113
-
114
-        if ($this->debug_enabled) {
59
+	protected function getPrimitiveMappingConfigOrThrow($data): array
60
+	{
61
+		$result = null;
62
+
63
+		$type = \gettype($data);
64
+		$result = $this->primitives[ $type ] ?? null;
65
+		if ($result === null) {
66
+			throw new \InvalidArgumentException(sprintf('No data conversion mapping configured for "%s" primitive.', $type));
67
+		}
68
+
69
+		if ($this->debug_enabled) {
70
+			Log::debug(__CLASS__ . ": Converting primitive type of '{$type}' to data node '{$result[ResponseBuilder::KEY_KEY]}'.");
71
+		}
72
+
73
+		return $result;
74
+	}
75
+
76
+	/**
77
+	 * Returns "converter/map" mapping configured for given $data object class or throws exception if not found.
78
+	 * Throws \RuntimeException if there's no config "classes" mapping entry for this object configured.
79
+	 * Throws \InvalidArgumentException if No data conversion mapping configured for given class.
80
+	 *
81
+	 * @param object $data Object to get config for.
82
+	 *
83
+	 * @return array
84
+	 *
85
+	 * @throws \InvalidArgumentException
86
+	 */
87
+	protected function getClassMappingConfigOrThrow(object $data): array
88
+	{
89
+		$result = null;
90
+		$debug_result = '';
91
+
92
+		// check for exact class name match...
93
+		$cls = \get_class($data);
94
+		if (\is_string($cls)) {
95
+			if (\array_key_exists($cls, $this->classes)) {
96
+				$result = $this->classes[ $cls ];
97
+				$debug_result = 'exact config match';
98
+			} else {
99
+				// no exact match, then lets try with `instanceof`
100
+				foreach (\array_keys($this->classes) as $class_name) {
101
+					if ($data instanceof $class_name) {
102
+						$result = $this->classes[ $class_name ];
103
+						$debug_result = "subclass of {$class_name}";
104
+						break;
105
+					}
106
+				}
107
+			}
108
+		}
109
+
110
+		if ($result === null) {
111
+			throw new \InvalidArgumentException(sprintf('No data conversion mapping configured for "%s" class.', $cls));
112
+		}
113
+
114
+		if ($this->debug_enabled) {
115 115
 			Log::debug(__CLASS__ . ": Converting {$cls} using {$result[ResponseBuilder::KEY_HANDLER]} because: {$debug_result}.");
116
-        }
117
-
118
-	    return $result;
119
-    }
120
-
121
-    /**
122
-     * Main entry for data conversion
123
-     *
124
-     * @param object|array|null $data
125
-     *
126
-     * @return mixed|null
127
-     *
128
-     * @throws \InvalidArgumentException
129
-     */
130
-    public function convert($data = null): ?array
131
-    {
132
-        if ($data === null) {
133
-            return null;
134
-        }
135
-
136
-        $result = null;
137
-
138
-	    Validator::assertIsType('data', $data, [
139
-		    Type::ARRAY,
140
-		    Type::BOOLEAN,
141
-		    Type::DOUBLE,
142
-		    Type::INTEGER,
143
-		    Type::STRING,
144
-		    Type::OBJECT,
145
-	    ]);
146
-
147
-	    if ($result === null && \is_object($data)) {
148
-		    $cfg = $this->getClassMappingConfigOrThrow($data);
149
-		    $worker = new $cfg[ ResponseBuilder::KEY_HANDLER ]();
150
-		    $result = [$cfg[ ResponseBuilder::KEY_KEY ] => $worker->convert($data, $cfg)];
151
-	    }
152
-
153
-	    if ($result === null && \is_array($data)) {
154
-	        $cfg = $this->getPrimitiveMappingConfigOrThrow($data);
155
-
156
-	        if ($this->hasNonNumericKeys($data)){
157
-		        $result = $this->convertArray($data);
158
-	        } else {
159
-		        $result = [$cfg[ ResponseBuilder::KEY_KEY ] => $this->convertArray($data)];
160
-	        }
161
-        }
162
-
163
-	    if ( \is_bool($data) || \is_float($data) || \is_int($data) || \is_string($data)) {
164
-		    $result = [$this->getPrimitiveMappingConfigOrThrow($data)[ ResponseBuilder::KEY_KEY ] => $data];
165
-	    }
166
-
167
-	    return $result;
168
-    }
116
+		}
117
+
118
+		return $result;
119
+	}
120
+
121
+	/**
122
+	 * Main entry for data conversion
123
+	 *
124
+	 * @param object|array|null $data
125
+	 *
126
+	 * @return mixed|null
127
+	 *
128
+	 * @throws \InvalidArgumentException
129
+	 */
130
+	public function convert($data = null): ?array
131
+	{
132
+		if ($data === null) {
133
+			return null;
134
+		}
135
+
136
+		$result = null;
137
+
138
+		Validator::assertIsType('data', $data, [
139
+			Type::ARRAY,
140
+			Type::BOOLEAN,
141
+			Type::DOUBLE,
142
+			Type::INTEGER,
143
+			Type::STRING,
144
+			Type::OBJECT,
145
+		]);
146
+
147
+		if ($result === null && \is_object($data)) {
148
+			$cfg = $this->getClassMappingConfigOrThrow($data);
149
+			$worker = new $cfg[ ResponseBuilder::KEY_HANDLER ]();
150
+			$result = [$cfg[ ResponseBuilder::KEY_KEY ] => $worker->convert($data, $cfg)];
151
+		}
152
+
153
+		if ($result === null && \is_array($data)) {
154
+			$cfg = $this->getPrimitiveMappingConfigOrThrow($data);
155
+
156
+			if ($this->hasNonNumericKeys($data)){
157
+				$result = $this->convertArray($data);
158
+			} else {
159
+				$result = [$cfg[ ResponseBuilder::KEY_KEY ] => $this->convertArray($data)];
160
+			}
161
+		}
162
+
163
+		if ( \is_bool($data) || \is_float($data) || \is_int($data) || \is_string($data)) {
164
+			$result = [$this->getPrimitiveMappingConfigOrThrow($data)[ ResponseBuilder::KEY_KEY ] => $data];
165
+		}
166
+
167
+		return $result;
168
+	}
169 169
 
170 170
 	/**
171 171
 	 * Checks if given array uses custom (non numeric) keys.
@@ -174,97 +174,97 @@  discard block
 block discarded – undo
174 174
 	 *
175 175
 	 * @return bool
176 176
 	 */
177
-    protected function hasNonNumericKeys(array $data): bool
178
-    {
179
-	    foreach (\array_keys($data) as $key) {
180
-	    	if (!\is_int($key)) {
181
-	    		return true;
182
-		    }
183
-    	}
184
-
185
-	    return false;
186
-    }
187
-
188
-    /**
189
-     * Recursively walks $data array and converts all known objects if found. Note
190
-     * $data array is passed by reference so source $data array may be modified.
191
-     *
192
-     * @param array $data array to recursively convert known elements of
193
-     *
194
-     * @return array
195
-     *
196
-     * @throws \RuntimeException
197
-     */
198
-    protected function convertArray(array $data): array
199
-    {
200
-        // This is to ensure that we either have array with user provided keys i.e. ['foo'=>'bar'], which will then
201
-        // be turned into JSON object or array without user specified keys (['bar']) which we would return as JSON
202
-        // array. But you can't mix these two as the final JSON would not produce predictable results.
203
-        $string_keys_cnt = 0;
204
-        $int_keys_cnt = 0;
205
-        foreach ($data as $key => $val) {
206
-            if (\is_int($key)) {
207
-                $int_keys_cnt++;
208
-            } else {
209
-                $string_keys_cnt++;
210
-            }
211
-
212
-            if (($string_keys_cnt > 0) && ($int_keys_cnt > 0)) {
213
-                throw new \RuntimeException(
214
-                    'Invalid data array. Either set own keys for all the items or do not specify any keys at all. ' .
215
-                    'Arrays with mixed keys are not supported by design.');
216
-            }
217
-        }
218
-
219
-        foreach ($data as $key => $val) {
220
-            if (\is_array($val)) {
221
-                $data[ $key ] = $this->convertArray($val);
222
-            } elseif (\is_object($val)) {
223
-                $cfg = $this->getClassMappingConfigOrThrow($val);
224
-                $worker = new $cfg[ ResponseBuilder::KEY_HANDLER ]();
225
-                $converted_data = $worker->convert($val, $cfg);
226
-                $data[ $key ] = $converted_data;
227
-            }
228
-        }
229
-
230
-        return $data;
231
-    }
232
-
233
-    /**
234
-     * Reads and validates "converter/map" config mapping
235
-     *
236
-     * @return array Classes mapping as specified in configuration or empty array if configuration found
237
-     *
238
-     * @throws \RuntimeException if config mapping is technically invalid (i.e. not array etc).
239
-     */
240
-    protected static function getClassesMapping(): array
241
-    {
242
-        $classes = Config::get(ResponseBuilder::CONF_KEY_CONVERTER_CLASSES) ?? [];
243
-
244
-	    if (!\is_array($classes)) {
245
-		    throw new \RuntimeException(
246
-			    \sprintf('CONFIG: "%s" mapping must be an array (%s given)', ResponseBuilder::CONF_KEY_CONVERTER_CLASSES, \gettype($classes)));
247
-	    }
248
-
249
-	    if (!empty($classes)) {
250
-		    $mandatory_keys = [
251
-			    ResponseBuilder::KEY_HANDLER,
252
-			    ResponseBuilder::KEY_KEY,
253
-		    ];
254
-		    foreach ($classes as $class_name => $class_config) {
255
-			    if (!\is_array($class_config)) {
256
-				    throw new \InvalidArgumentException(sprintf("CONFIG: Config for '{$class_name}' class must be an array (%s given).", \gettype($class_config)));
257
-			    }
258
-			    foreach ($mandatory_keys as $key_name) {
259
-				    if (!\array_key_exists($key_name, $class_config)) {
260
-					    throw new \RuntimeException("CONFIG: Missing '{$key_name}' for '{$class_name}' class mapping");
261
-				    }
262
-			    }
263
-		    }
264
-	    }
265
-
266
-        return $classes;
267
-    }
177
+	protected function hasNonNumericKeys(array $data): bool
178
+	{
179
+		foreach (\array_keys($data) as $key) {
180
+			if (!\is_int($key)) {
181
+				return true;
182
+			}
183
+		}
184
+
185
+		return false;
186
+	}
187
+
188
+	/**
189
+	 * Recursively walks $data array and converts all known objects if found. Note
190
+	 * $data array is passed by reference so source $data array may be modified.
191
+	 *
192
+	 * @param array $data array to recursively convert known elements of
193
+	 *
194
+	 * @return array
195
+	 *
196
+	 * @throws \RuntimeException
197
+	 */
198
+	protected function convertArray(array $data): array
199
+	{
200
+		// This is to ensure that we either have array with user provided keys i.e. ['foo'=>'bar'], which will then
201
+		// be turned into JSON object or array without user specified keys (['bar']) which we would return as JSON
202
+		// array. But you can't mix these two as the final JSON would not produce predictable results.
203
+		$string_keys_cnt = 0;
204
+		$int_keys_cnt = 0;
205
+		foreach ($data as $key => $val) {
206
+			if (\is_int($key)) {
207
+				$int_keys_cnt++;
208
+			} else {
209
+				$string_keys_cnt++;
210
+			}
211
+
212
+			if (($string_keys_cnt > 0) && ($int_keys_cnt > 0)) {
213
+				throw new \RuntimeException(
214
+					'Invalid data array. Either set own keys for all the items or do not specify any keys at all. ' .
215
+					'Arrays with mixed keys are not supported by design.');
216
+			}
217
+		}
218
+
219
+		foreach ($data as $key => $val) {
220
+			if (\is_array($val)) {
221
+				$data[ $key ] = $this->convertArray($val);
222
+			} elseif (\is_object($val)) {
223
+				$cfg = $this->getClassMappingConfigOrThrow($val);
224
+				$worker = new $cfg[ ResponseBuilder::KEY_HANDLER ]();
225
+				$converted_data = $worker->convert($val, $cfg);
226
+				$data[ $key ] = $converted_data;
227
+			}
228
+		}
229
+
230
+		return $data;
231
+	}
232
+
233
+	/**
234
+	 * Reads and validates "converter/map" config mapping
235
+	 *
236
+	 * @return array Classes mapping as specified in configuration or empty array if configuration found
237
+	 *
238
+	 * @throws \RuntimeException if config mapping is technically invalid (i.e. not array etc).
239
+	 */
240
+	protected static function getClassesMapping(): array
241
+	{
242
+		$classes = Config::get(ResponseBuilder::CONF_KEY_CONVERTER_CLASSES) ?? [];
243
+
244
+		if (!\is_array($classes)) {
245
+			throw new \RuntimeException(
246
+				\sprintf('CONFIG: "%s" mapping must be an array (%s given)', ResponseBuilder::CONF_KEY_CONVERTER_CLASSES, \gettype($classes)));
247
+		}
248
+
249
+		if (!empty($classes)) {
250
+			$mandatory_keys = [
251
+				ResponseBuilder::KEY_HANDLER,
252
+				ResponseBuilder::KEY_KEY,
253
+			];
254
+			foreach ($classes as $class_name => $class_config) {
255
+				if (!\is_array($class_config)) {
256
+					throw new \InvalidArgumentException(sprintf("CONFIG: Config for '{$class_name}' class must be an array (%s given).", \gettype($class_config)));
257
+				}
258
+				foreach ($mandatory_keys as $key_name) {
259
+					if (!\array_key_exists($key_name, $class_config)) {
260
+						throw new \RuntimeException("CONFIG: Missing '{$key_name}' for '{$class_name}' class mapping");
261
+					}
262
+				}
263
+			}
264
+		}
265
+
266
+		return $classes;
267
+	}
268 268
 
269 269
 	/**
270 270
 	 * Reads and validates "converter/primitives" config mapping
Please login to merge, or discard this patch.