| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603 |
- <?php
- /**
- * ObjectSerializer
- *
- * PHP version 8.1
- *
- * @category Class
- * @package WikipaliApi
- * @author OpenAPI Generator team
- * @link https://openapi-generator.tech
- */
- /**
- * MINT API
- *
- * International Academy Of Pali Tipitaka(国际巴利三藏学院) 由 `php openapi/scripts/generate.php` 依据 api-v13 的路由与控制器源码生成。 响应统一封装为 `{ok, message, data}`;`ok=false` 时 `message` 为错误信息。
- *
- * The version of the OpenAPI document: 2026.10.15
- * Generated by: https://openapi-generator.tech
- * Generator version: 7.25.0
- */
- /**
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
- namespace WikipaliApi;
- use GuzzleHttp\Psr7\Utils;
- use WikipaliApi\Model\ModelInterface;
- /**
- * ObjectSerializer Class Doc Comment
- *
- * @category Class
- * @package WikipaliApi
- * @author OpenAPI Generator team
- * @link https://openapi-generator.tech
- */
- class ObjectSerializer
- {
- /** @var string */
- private static $dateTimeFormat = \DateTime::ATOM;
- /**
- * Change the date format
- *
- * @param string $format the new date format to use
- */
- public static function setDateTimeFormat($format)
- {
- self::$dateTimeFormat = $format;
- }
- /**
- * Serialize data
- *
- * @param mixed $data the data to serialize
- * @param string|null $type the OpenAPIToolsType of the data
- * @param string|null $format the format of the OpenAPITools type of the data
- *
- * @return scalar|object|array|null serialized form of $data
- */
- public static function sanitizeForSerialization($data, $type = null, $format = null)
- {
- if (is_scalar($data) || null === $data) {
- return $data;
- }
- if ($data instanceof \DateTime) {
- return ($format === 'date') ? $data->format('Y-m-d') : $data->format(self::$dateTimeFormat);
- }
- if (is_array($data)) {
- foreach ($data as $property => $value) {
- $data[$property] = self::sanitizeForSerialization($value);
- }
- return $data;
- }
- if (is_object($data)) {
- $values = [];
- if ($data instanceof ModelInterface) {
- $formats = $data::openAPIFormats();
- foreach ($data::openAPITypes() as $property => $openAPIType) {
- $getter = $data::getters()[$property];
- $value = $data->$getter();
- if ($value !== null && !in_array($openAPIType, ['\DateTime', '\SplFileObject', 'array', 'bool', 'boolean', 'byte', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) {
- $callable = [$openAPIType, 'getAllowableEnumValues'];
- if (is_callable($callable)) {
- /** array $callable */
- $allowedEnumTypes = $callable();
- if (!in_array($value, $allowedEnumTypes, true)) {
- $imploded = implode("', '", $allowedEnumTypes);
- throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'");
- }
- }
- }
- if (($data::isNullable($property) && $data->isNullableSetToNull($property)) || $value !== null) {
- $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]);
- }
- }
- } else {
- foreach ($data as $property => $value) {
- $values[$property] = self::sanitizeForSerialization($value);
- }
- }
- return (object) $values;
- } else {
- return (string)$data;
- }
- }
- /**
- * Sanitize filename by removing path.
- * e.g. ../../sun.gif becomes sun.gif
- *
- * @param string $filename filename to be sanitized
- *
- * @return string the sanitized filename
- */
- public static function sanitizeFilename($filename)
- {
- if (preg_match("/.*[\/\\\\](.*)$/", $filename, $match)) {
- return $match[1];
- } else {
- return $filename;
- }
- }
- /**
- * Shorter timestamp microseconds to 6 digits length.
- *
- * @param string $timestamp Original timestamp
- *
- * @return string the shorten timestamp
- */
- public static function sanitizeTimestamp($timestamp)
- {
- if (!is_string($timestamp)) {
- return $timestamp;
- }
- return preg_replace('/(:\d{2}.\d{6})\d*/', '$1', $timestamp);
- }
- /**
- * Take value and turn it into a string suitable for inclusion in
- * the path, by url-encoding.
- *
- * @param string $value a string which will be part of the path
- *
- * @return string the serialized object
- */
- public static function toPathValue($value)
- {
- return rawurlencode(self::toString($value));
- }
- /**
- * Checks if a value is empty, based on its OpenAPI type.
- *
- * @param mixed $value
- * @param string $openApiType
- *
- * @return bool true if $value is empty
- */
- private static function isEmptyValue($value, string $openApiType): bool
- {
- // If empty() returns false, it is not empty regardless of its type.
- if (!empty($value)) {
- return false;
- }
- // Null is always empty, as we cannot send a real "null" value in a query parameter.
- if ($value === null) {
- return true;
- }
- switch ($openApiType) {
- // For numeric values, false and '' are considered empty.
- // This comparison is safe for floating point values, since the previous call to empty() will
- // filter out values that don't match 0.
- case 'int':
- case 'integer':
- return $value !== 0;
- case 'number':
- case 'float':
- return $value !== 0 && $value !== 0.0;
- // For boolean values, '' is considered empty
- case 'bool':
- case 'boolean':
- return !in_array($value, [false, 0], true);
- // For string values, '' is considered empty.
- case 'string':
- return $value === '';
- // For all the other types, any value at this point can be considered empty.
- default:
- return true;
- }
- }
- /**
- * Take query parameter properties and turn it into an array suitable for
- * native http_build_query or GuzzleHttp\Psr7\Query::build.
- *
- * @param mixed $value Parameter value
- * @param string $paramName Parameter name
- * @param string $openApiType OpenAPIType eg. array or object
- * @param string $style Parameter serialization style
- * @param bool $explode Parameter explode option
- * @param bool $required Whether query param is required or not
- *
- * @return array
- */
- public static function toQueryValue(
- $value,
- string $paramName,
- string $openApiType = 'string',
- string $style = 'form',
- bool $explode = true,
- bool $required = true
- ): array {
- // Check if we should omit this parameter from the query. This should only happen when:
- // - Parameter is NOT required; AND
- // - its value is set to a value that is equivalent to "empty", depending on its OpenAPI type. For
- // example, 0 as "int" or "boolean" is NOT an empty value.
- if (self::isEmptyValue($value, $openApiType)) {
- if ($required) {
- return ["{$paramName}" => ''];
- } else {
- return [];
- }
- }
- // Handle DateTime objects in query
- if ($openApiType === "\\DateTime" && $value instanceof \DateTime) {
- return ["{$paramName}" => $value->format(self::$dateTimeFormat)];
- }
- $query = [];
- $value = (in_array($openApiType, ['object', 'array'], true)) ? (array)$value : $value;
- // since \GuzzleHttp\Psr7\Query::build fails with nested arrays
- // need to flatten array first
- $flattenArray = function ($arr, $name, &$result = []) use (&$flattenArray, $style, $explode) {
- if (!is_array($arr)) {
- return $arr;
- }
- foreach ($arr as $k => $v) {
- $prop = ($style === 'deepObject') ? "{$name}[{$k}]" : $k;
- if (is_array($v)) {
- $flattenArray($v, $prop, $result);
- } else {
- if ($style !== 'deepObject' && !$explode) {
- // push key itself
- $result[] = $prop;
- }
- $result[$prop] = $v;
- }
- }
- return $result;
- };
- $value = $flattenArray($value, $paramName);
- // https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-values
- if ($openApiType === 'array' && $style === 'deepObject' && $explode) {
- return $value;
- }
- if ($openApiType === 'object' && ($style === 'deepObject' || $explode)) {
- return $value;
- }
- if ('boolean' === $openApiType && is_bool($value)) {
- $value = self::convertBoolToQueryStringFormat($value);
- }
- // handle style in serializeCollection
- $query[$paramName] = ($explode) ? $value : self::serializeCollection((array)$value, $style);
- return $query;
- }
- /**
- * Convert boolean value to format for query string.
- *
- * @param bool $value Boolean value
- *
- * @return int|string Boolean value in format
- */
- public static function convertBoolToQueryStringFormat(bool $value)
- {
- if (Configuration::BOOLEAN_FORMAT_STRING == Configuration::getDefaultConfiguration()->getBooleanFormatForQueryString()) {
- return $value ? 'true' : 'false';
- }
- return (int) $value;
- }
- /**
- * Take value and turn it into a string suitable for inclusion in
- * the header. If it's a string, pass through unchanged
- * If it's a datetime object, format it in ISO8601
- *
- * @param string $value a string which will be part of the header
- *
- * @return string the header string
- */
- public static function toHeaderValue($value)
- {
- $callable = [$value, 'toHeaderValue'];
- if (is_callable($callable)) {
- return $callable();
- }
- return self::toString($value);
- }
- /**
- * Take value and turn it into a string suitable for inclusion in
- * the parameter. If it's a string, pass through unchanged
- * If it's a datetime object, format it in ISO8601
- * If it's a boolean, convert it to "true" or "false".
- *
- * @param float|int|bool|\DateTime $value the value of the parameter
- *
- * @return string the header string
- */
- public static function toString($value)
- {
- if ($value instanceof \DateTime) { // datetime in ISO8601 format
- return $value->format(self::$dateTimeFormat);
- } elseif (is_bool($value)) {
- return $value ? 'true' : 'false';
- } else {
- return (string) $value;
- }
- }
- /**
- * Serialize an array to a string.
- *
- * @param array $collection collection to serialize to a string
- * @param string $style the format use for serialization (csv,
- * ssv, tsv, pipes, multi)
- * @param bool $allowCollectionFormatMulti allow collection format to be a multidimensional array
- *
- * @return string
- */
- public static function serializeCollection(array $collection, $style, $allowCollectionFormatMulti = false)
- {
- if ($allowCollectionFormatMulti && ('multi' === $style)) {
- // http_build_query() almost does the job for us. We just
- // need to fix the result of multidimensional arrays.
- return preg_replace('/%5B[0-9]+%5D=/', '=', http_build_query($collection, '', '&'));
- }
- switch ($style) {
- case 'pipeDelimited':
- case 'pipes':
- return implode('|', $collection);
- case 'tsv':
- return implode("\t", $collection);
- case 'spaceDelimited':
- case 'ssv':
- return implode(' ', $collection);
- case 'simple':
- case 'csv':
- // Deliberate fall through. CSV is default format.
- default:
- return implode(',', $collection);
- }
- }
- /**
- * Deserialize a JSON string into an object
- *
- * @param mixed $data object or primitive to be deserialized
- * @param string $class class name is passed as a string
- * @param string[]|null $httpHeaders HTTP headers
- *
- * @return object|array|null a single or an array of $class instances
- */
- public static function deserialize($data, $class, $httpHeaders = null)
- {
- if (null === $data) {
- return null;
- }
- if (strcasecmp(substr($class, -2), '[]') === 0) {
- $data = is_string($data) ? json_decode($data) : $data;
- if (!is_array($data)) {
- throw new \InvalidArgumentException("Invalid array '$class'");
- }
- $subClass = substr($class, 0, -2);
- $values = [];
- foreach ($data as $key => $value) {
- $values[] = self::deserialize($value, $subClass, null);
- }
- return $values;
- }
- if (preg_match('/^(array<|map\[)/', $class)) { // for associative array e.g. array<string,int>
- $data = is_string($data) ? json_decode($data) : $data;
- settype($data, 'array');
- $inner = substr($class, 4, -1);
- $deserialized = [];
- if (strrpos($inner, ",") !== false) {
- $subClass_array = explode(',', $inner, 2);
- $subClass = $subClass_array[1];
- foreach ($data as $key => $value) {
- $deserialized[$key] = self::deserialize($value, $subClass, null);
- }
- }
- return $deserialized;
- }
- if ($class === 'object') {
- settype($data, 'array');
- return $data;
- } elseif ($class === 'mixed') {
- settype($data, gettype($data));
- return $data;
- }
- if ($class === '\DateTime') {
- // Some APIs return an invalid, empty string as a
- // date-time property. DateTime::__construct() will return
- // the current time for empty input which is probably not
- // what is meant. The invalid empty string is probably to
- // be interpreted as a missing field/value. Let's handle
- // this graceful.
- if (!empty($data)) {
- try {
- return new \DateTime($data);
- } catch (\Exception $exception) {
- // Some APIs return a date-time with too high nanosecond
- // precision for php's DateTime to handle.
- // With provided regexp 6 digits of microseconds saved
- return new \DateTime(self::sanitizeTimestamp($data));
- }
- } else {
- return null;
- }
- }
- if ($class === '\SplFileObject') {
- $data = Utils::streamFor($data);
- /** @var \Psr\Http\Message\StreamInterface $data */
- // determine file name
- if (
- is_array($httpHeaders)
- && array_key_exists('Content-Disposition', $httpHeaders)
- && preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeaders['Content-Disposition'], $match)
- ) {
- $filename = Configuration::getDefaultConfiguration()->getTempFolderPath() . DIRECTORY_SEPARATOR . self::sanitizeFilename($match[1]);
- } else {
- $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), '');
- }
- $file = fopen($filename, 'w');
- while ($chunk = $data->read(200)) {
- fwrite($file, $chunk);
- }
- fclose($file);
- return new \SplFileObject($filename, 'r');
- }
- /** @psalm-suppress ParadoxicalCondition */
- if (in_array($class, ['\DateTime', '\SplFileObject', 'array', 'bool', 'boolean', 'byte', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) {
- settype($data, $class);
- return $data;
- }
- if (method_exists($class, 'getAllowableEnumValues')) {
- if (!in_array($data, $class::getAllowableEnumValues(), true)) {
- $imploded = implode("', '", $class::getAllowableEnumValues());
- throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'");
- }
- return $data;
- } else {
- $data = is_string($data) ? json_decode($data) : $data;
- if (is_array($data)) {
- $data = (object) $data;
- }
- // If a discriminator is defined and points to a valid subclass, use it.
- $discriminator = $class::DISCRIMINATOR;
- if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) {
- $subclass = '\WikipaliApi\Model\\' . $data->{$discriminator};
- if (is_subclass_of($subclass, $class)) {
- $class = $subclass;
- }
- }
- /** @var ModelInterface $instance */
- $instance = new $class();
- foreach ($instance::openAPITypes() as $property => $type) {
- $propertySetter = $instance::setters()[$property];
- if (!isset($propertySetter)) {
- continue;
- }
- if (!isset($data->{$instance::attributeMap()[$property]})) {
- if ($instance::isNullable($property)) {
- $instance->$propertySetter(null);
- }
- continue;
- }
- if (isset($data->{$instance::attributeMap()[$property]})) {
- $propertyValue = $data->{$instance::attributeMap()[$property]};
- $instance->$propertySetter(self::deserialize($propertyValue, $type, null));
- }
- }
- return $instance;
- }
- }
- /**
- * Build a query string from an array of key value pairs.
- *
- * This function can use the return value of `parse()` to build a query
- * string. This function does not modify the provided keys when an array is
- * encountered (like `http_build_query()` would).
- *
- * The function is copied from https://github.com/guzzle/psr7/blob/a243f80a1ca7fe8ceed4deee17f12c1930efe662/src/Query.php#L59-L112
- * with a modification which is described in https://github.com/guzzle/psr7/pull/603
- *
- * @param array $params Query string parameters.
- * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986
- * to encode using RFC3986, or PHP_QUERY_RFC1738
- * to encode using RFC1738.
- */
- public static function buildQuery(array $params, $encoding = PHP_QUERY_RFC3986): string
- {
- if (!$params) {
- return '';
- }
- if ($encoding === false) {
- $encoder = function (string $str): string {
- return $str;
- };
- } elseif ($encoding === PHP_QUERY_RFC3986) {
- $encoder = 'rawurlencode';
- } elseif ($encoding === PHP_QUERY_RFC1738) {
- $encoder = 'urlencode';
- } else {
- throw new \InvalidArgumentException('Invalid type');
- }
- $castBool = Configuration::BOOLEAN_FORMAT_INT == Configuration::getDefaultConfiguration()->getBooleanFormatForQueryString()
- ? function ($v) { return (int) $v; }
- : function ($v) { return $v ? 'true' : 'false'; };
- $qs = '';
- foreach ($params as $k => $v) {
- $k = $encoder((string) $k);
- if (!is_array($v)) {
- $qs .= $k;
- $v = is_bool($v) ? $castBool($v) : $v;
- if ($v !== null) {
- $qs .= '='.$encoder((string) $v);
- }
- $qs .= '&';
- } else {
- foreach ($v as $vv) {
- $qs .= $k;
- $vv = is_bool($vv) ? $castBool($vv) : $vv;
- if ($vv !== null) {
- $qs .= '='.$encoder((string) $vv);
- }
- $qs .= '&';
- }
- }
- }
- return $qs ? substr($qs, 0, -1) : '';
- }
- }
|