Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
67.20% |
84 / 125 |
|
42.86% |
3 / 7 |
CRAP | |
0.00% |
0 / 1 |
| ObjectSerializer | |
67.20% |
84 / 125 |
|
42.86% |
3 / 7 |
225.41 | |
0.00% |
0 / 1 |
| sanitizeForSerialization | |
69.23% |
27 / 39 |
|
0.00% |
0 / 1 |
36.10 | |||
| toPathValue | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| toQueryValue | |
42.86% |
6 / 14 |
|
0.00% |
0 / 1 |
28.66 | |||
| toString | |
66.67% |
2 / 3 |
|
0.00% |
0 / 1 |
3.33 | |||
| deserialize | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
| mapToClass | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
6 | |||
| castData | |
62.96% |
34 / 54 |
|
0.00% |
0 / 1 |
53.26 | |||
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * ObjectSerializer. |
| 5 | * |
| 6 | * PHP version 5 |
| 7 | * |
| 8 | * @category Class |
| 9 | * |
| 10 | * @author Swagger Codegen team |
| 11 | * |
| 12 | * @see https://github.com/swagger-api/swagger-codegen |
| 13 | */ |
| 14 | |
| 15 | /** |
| 16 | * Fingerprint Pro Server API. |
| 17 | * |
| 18 | * Fingerprint Pro Server API allows you to get information about visitors and about individual events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios. Server API is intended for server-side usage, it's not intended to be used from the client side, whether it's a browser or a mobile device. |
| 19 | * |
| 20 | * OpenAPI spec version: 3 |
| 21 | * Contact: support@fingerprint.com |
| 22 | * Generated by: https://github.com/swagger-api/swagger-codegen.git |
| 23 | * Swagger Codegen version: 3.0.34 |
| 24 | */ |
| 25 | /** |
| 26 | * NOTE: This class is auto generated by the swagger code generator program. |
| 27 | * https://github.com/swagger-api/swagger-codegen |
| 28 | * Do not edit the class manually. |
| 29 | */ |
| 30 | |
| 31 | namespace Fingerprint\ServerAPI; |
| 32 | |
| 33 | use Psr\Http\Message\ResponseInterface; |
| 34 | |
| 35 | /** |
| 36 | * ObjectSerializer Class Doc Comment. |
| 37 | * |
| 38 | * @category Class |
| 39 | * |
| 40 | * @author Swagger Codegen team |
| 41 | * |
| 42 | * @see https://github.com/swagger-api/swagger-codegen |
| 43 | */ |
| 44 | class ObjectSerializer |
| 45 | { |
| 46 | /** |
| 47 | * Serialize data. |
| 48 | * |
| 49 | * @param mixed $data the data to serialize |
| 50 | * @param string|null $format the format of the Swagger type of the data |
| 51 | * |
| 52 | * @return array|object|string serialized form of $data |
| 53 | */ |
| 54 | public static function sanitizeForSerialization(mixed $data, ?string $format = null): array|bool|object|string |
| 55 | { |
| 56 | if (is_scalar($data) || null === $data) { |
| 57 | return $data; |
| 58 | } |
| 59 | if ($data instanceof \DateTime) { |
| 60 | return ('date' === $format) ? $data->format('Y-m-d') : $data->format(\DateTime::ATOM); |
| 61 | } |
| 62 | if (is_array($data)) { |
| 63 | foreach ($data as $property => $value) { |
| 64 | if (is_scalar($value)) { |
| 65 | $data[$property] = $value; |
| 66 | } else { |
| 67 | $data[$property] = self::sanitizeForSerialization($value); |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | return $data; |
| 72 | } |
| 73 | if ($data instanceof \stdClass) { |
| 74 | foreach ($data as $property => $value) { |
| 75 | if (is_scalar($value)) { |
| 76 | $data->{$property} = $value; |
| 77 | } else { |
| 78 | $data->{$property} = self::sanitizeForSerialization($value); |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | return $data; |
| 83 | } |
| 84 | |
| 85 | if (is_object($data)) { |
| 86 | $class = get_class($data); |
| 87 | if (enum_exists($class)) { |
| 88 | return $data->value; |
| 89 | } |
| 90 | $values = []; |
| 91 | $formats = $data::swaggerFormats(); |
| 92 | foreach ($data::swaggerTypes() as $property => $swaggerType) { |
| 93 | $getter = $data::getters()[$property]; |
| 94 | $value = $data->{$getter}(); |
| 95 | if (null !== $value |
| 96 | && !in_array($swaggerType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) |
| 97 | && method_exists($swaggerType, 'getAllowableEnumValues') |
| 98 | && !in_array($value, $swaggerType::getAllowableEnumValues())) { |
| 99 | $imploded = implode("', '", $swaggerType::getAllowableEnumValues()); |
| 100 | |
| 101 | throw new \InvalidArgumentException("Invalid value for enum '{$swaggerType}', must be one of: '{$imploded}'"); |
| 102 | } |
| 103 | if (null !== $value) { |
| 104 | if (is_scalar($value)) { |
| 105 | $values[$data::attributeMap()[$property]] = $value; |
| 106 | } elseif ('tag' === $property && empty($value)) { |
| 107 | $values[$data::attributeMap()[$property]] = new \stdClass(); |
| 108 | } else { |
| 109 | $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $swaggerType, $formats[$property]); |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | return (object) $values; |
| 115 | } |
| 116 | |
| 117 | return (string) $data; |
| 118 | } |
| 119 | |
| 120 | /** |
| 121 | * Take value and turn it into a string suitable for inclusion in |
| 122 | * the path, by url-encoding. |
| 123 | * |
| 124 | * @param string $value a string which will be part of the path |
| 125 | * |
| 126 | * @return string the serialized object |
| 127 | */ |
| 128 | public static function toPathValue(string $value): string |
| 129 | { |
| 130 | return rawurlencode(self::toString($value)); |
| 131 | } |
| 132 | |
| 133 | /** |
| 134 | * Take value and turn it into a string suitable for inclusion in |
| 135 | * the query, by imploding comma-separated if it's an object. |
| 136 | * If it's a string, pass through unchanged. It will be url-encoded |
| 137 | * later. |
| 138 | * |
| 139 | * @param \DateTime|string|string[] $object an object to be serialized to a string |
| 140 | * @param string|null $format the format of the parameter |
| 141 | * |
| 142 | * @return array|string the serialized object |
| 143 | */ |
| 144 | public static function toQueryValue(array|bool|\DateTime|string $object, ?string $format = null): array|string |
| 145 | { |
| 146 | if (is_array($object)) { |
| 147 | switch ($format) { |
| 148 | case 'multi': |
| 149 | return $object; |
| 150 | |
| 151 | case 'ssv': |
| 152 | return implode(' ', $object); |
| 153 | |
| 154 | case 'tsv': |
| 155 | return implode("\t", $object); |
| 156 | |
| 157 | case 'pipes': |
| 158 | return implode('|', $object); |
| 159 | |
| 160 | case 'csv': |
| 161 | default: |
| 162 | return implode(',', $object); |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | if (is_bool($object)) { |
| 167 | return $object ? 'true' : 'false'; |
| 168 | } |
| 169 | |
| 170 | return self::toString($object, $format); |
| 171 | } |
| 172 | |
| 173 | /** |
| 174 | * Take value and turn it into a string suitable for inclusion in |
| 175 | * the parameter. If it's a string, pass through unchanged |
| 176 | * If it's a datetime object, format it in RFC3339 |
| 177 | * If it's a date, format it in Y-m-d. |
| 178 | * |
| 179 | * @param \DateTime|string $value the value of the parameter |
| 180 | * @param string|null $format the format of the parameter |
| 181 | * |
| 182 | * @return string the header string |
| 183 | */ |
| 184 | public static function toString(\DateTime|string $value, ?string $format = null): string |
| 185 | { |
| 186 | if ($value instanceof \DateTime) { |
| 187 | return ('date' === $format) ? $value->format('Y-m-d') : $value->format(\DateTime::ATOM); |
| 188 | } |
| 189 | |
| 190 | return $value; |
| 191 | } |
| 192 | |
| 193 | /** |
| 194 | * Deserialize a JSON string into an object. |
| 195 | * |
| 196 | * @param string $class class name is passed as a string |
| 197 | * |
| 198 | * @throws \Exception |
| 199 | */ |
| 200 | public static function deserialize(ResponseInterface $response, string $class): mixed |
| 201 | { |
| 202 | $data = $response->getBody()->getContents(); |
| 203 | $response->getBody()->rewind(); |
| 204 | |
| 205 | return self::mapToClass($data, $class, $response); |
| 206 | } |
| 207 | |
| 208 | protected static function mapToClass(mixed $data, string $class, ResponseInterface $response): mixed |
| 209 | { |
| 210 | if ('string' === gettype($data)) { |
| 211 | $data = json_decode($data, false); |
| 212 | } |
| 213 | $instance = new $class(); |
| 214 | foreach ($instance::swaggerTypes() as $property => $type) { |
| 215 | $propertySetter = $instance::setters()[$property]; |
| 216 | |
| 217 | if (!isset($propertySetter) || !isset($data->{$instance::attributeMap()[$property]})) { |
| 218 | continue; |
| 219 | } |
| 220 | |
| 221 | $propertyValue = $data->{$instance::attributeMap()[$property]}; |
| 222 | if (isset($propertyValue)) { |
| 223 | $instance->{$propertySetter}(self::castData($propertyValue, $type, $response)); |
| 224 | } |
| 225 | } |
| 226 | |
| 227 | return $instance; |
| 228 | } |
| 229 | |
| 230 | protected static function castData(mixed $data, string $class, ResponseInterface $response): mixed |
| 231 | { |
| 232 | if (null === $data) { |
| 233 | return null; |
| 234 | } |
| 235 | if (str_starts_with($class, 'map[')) { // for associative array e.g. map[string,int] |
| 236 | $inner = substr($class, 4, -1); |
| 237 | $deserialized = []; |
| 238 | if (false !== strrpos($inner, ',')) { |
| 239 | $subClass_array = explode(',', $inner, 2); |
| 240 | $subClass = $subClass_array[1]; |
| 241 | foreach ($data as $key => $value) { |
| 242 | $deserialized[$key] = self::castData($value, $subClass, $response); |
| 243 | } |
| 244 | } |
| 245 | |
| 246 | return $deserialized; |
| 247 | } |
| 248 | if (0 === strcasecmp(substr($class, -2), '[]')) { |
| 249 | $subClass = substr($class, 0, -2); |
| 250 | $values = []; |
| 251 | foreach ($data as $key => $value) { |
| 252 | $values[] = self::castData($value, $subClass, $response); |
| 253 | } |
| 254 | |
| 255 | return $values; |
| 256 | } |
| 257 | if ('mixed' === $class) { |
| 258 | if ($data instanceof \stdClass) { |
| 259 | if (empty(get_object_vars($data))) { |
| 260 | return null; |
| 261 | } |
| 262 | |
| 263 | return (array) $data; |
| 264 | } |
| 265 | |
| 266 | return $data; |
| 267 | } |
| 268 | if ('object' === $class || 'array' === $class) { |
| 269 | settype($data, 'array'); |
| 270 | |
| 271 | return $data; |
| 272 | } |
| 273 | if ('\DateTime' === $class) { |
| 274 | // Some API's return an invalid, empty string as a |
| 275 | // date-time property. DateTime::__construct() will return |
| 276 | // the current time for empty input which is probably not |
| 277 | // what is meant. The invalid empty string is probably to |
| 278 | // be interpreted as a missing field/value. Let's handle |
| 279 | // this graceful. |
| 280 | if (!empty($data)) { |
| 281 | return new \DateTime($data); |
| 282 | } |
| 283 | |
| 284 | return null; |
| 285 | } |
| 286 | if (in_array($class, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) { |
| 287 | $originalData = $data; |
| 288 | $normalizedClass = strtolower($class); |
| 289 | |
| 290 | switch ($normalizedClass) { |
| 291 | case 'int': |
| 292 | $normalizedClass = 'integer'; |
| 293 | |
| 294 | break; |
| 295 | |
| 296 | case 'bool': |
| 297 | $normalizedClass = 'boolean'; |
| 298 | |
| 299 | break; |
| 300 | } |
| 301 | if ('float' === $normalizedClass && is_numeric($originalData)) { |
| 302 | return (float) $originalData; |
| 303 | } |
| 304 | if ('string' === $normalizedClass && is_object($data)) { |
| 305 | throw new SerializationException($response); |
| 306 | } |
| 307 | |
| 308 | settype($data, $class); |
| 309 | if (gettype($data) === $normalizedClass) { |
| 310 | return $data; |
| 311 | } |
| 312 | |
| 313 | throw new SerializationException($response); |
| 314 | } elseif (enum_exists($class)) { |
| 315 | try { |
| 316 | return $class::from($data); |
| 317 | } catch (\ValueError $e) { |
| 318 | $allowedValues = array_map(fn ($case) => $case->value, $class::cases()); |
| 319 | $imploded = implode("', '", $allowedValues); |
| 320 | |
| 321 | throw new \InvalidArgumentException("Invalid value '{$data}' for enum '{$class}', must be one of: '{$imploded}'"); |
| 322 | } |
| 323 | |
| 324 | return $data; |
| 325 | } |
| 326 | |
| 327 | return self::mapToClass($data, $class, $response); |
| 328 | } |
| 329 | } |