typehint = $typehint; $this->context = $context; } /** * Return the typehint as read from the docblock * * @return string */ public function __toString() { return $this->typehint; } /** * Return the base type * * This is the type this variable is. Eg. a string[] is an array. * * @return string */ public function getBaseType() { $typehint = $this->typehint; if (str_ends_with($typehint, '[]')) { return 'array'; } if (in_array($typehint, ['boolean', 'false', 'true'])) { return 'bool'; } if (in_array($typehint, ['integer', 'date'])) { return 'int'; } if ($typehint === 'file') { return 'string'; } // fully qualified class name if ($typehint[0] === '\\') { return ltrim($typehint, '\\'); } // relative class name, try to resolve if ($this->context && ctype_upper($typehint[0])) { return ClassResolver::getInstance()->resolve($typehint, $this->context); } return $typehint; } /** * Return a primitive type understood by the XMLRPC server * * @param string $typehint * @return string */ public function getJSONRPCType() { return $this->getBaseType(); } /** * Get the base type as one of the supported OpenAPI types * * Formats (eg. int32 or double) are not supported * * @link https://swagger.io/docs/specification/data-models/data-types/ * @return string */ public function getOpenApiType() { switch ($this->getBaseType()) { case 'int': return 'integer'; case 'bool': return 'boolean'; case 'array': return 'array'; case 'string': case 'mixed': return 'string'; case 'double': case 'float': return 'number'; default: return 'object'; } } /** * If this is an array, return the type of the array elements * * @return Type|null null if this is not a typed array */ public function getSubType() { $type = $this->typehint; if (!str_ends_with($type, '[]')) { return null; } $type = substr($type, 0, -2); return new Type($type, $this->context); } /** * Return a type understood by the XMLRPC server * * @return string */ public function getXMLRPCType() { $type = $this->typehint; // keep custom types if (in_array($type, ['date', 'file', 'struct'])) { return $type; } $type = $this->getBaseType($this->typehint); // primitive types if (in_array($type, ['int', 'string', 'double', 'bool', 'array'])) { return $type; } // everything else is an object return 'object'; //should this return 'struct'? } }