AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core\router\schema\response\content;
use core\exception\coding_exception;
use core\router\schema\example;
use core\router\schema\openapi_base;
use core\router\schema\objects\type_base;
use core\router\schema\specification;
/**
* An OpenAPI MediaType.
* https://swagger.io/specification/#media-type-object
*
* @package core
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class media_type extends openapi_base {
/**
* Create a new instance of a media_type definition.
*
* @param type_base|null $schema The OpenAPI Schema to use
* @param example|null $example An example of the media type
* @param example[] $examples An array of examples of the media type
* @param bool $required Whether the media_type is required
* @param mixed[] ...$extra
* @throws coding_exception
*/
public function __construct(
/** @var type_base|null The OpenAPI Schema to use */
protected ?type_base $schema = null,
/** @var example|null An example of the media type */
protected ?example $example = null,
/** @var example[] An array of examples of the media type */
protected array $examples = [],
/** @var bool Whether the media_type is required */
protected bool $required = false,
...$extra,
) {
if ($example) {
if (count($examples)) {
throw new coding_exception('Only one of example or examples can be specified.');
}
$this->examples[$example->get_name()] = $example;
}
parent::__construct(...$extra);
}
#[\Override]
public function get_openapi_description(
specification $api,
?string $path = null,
): ?\stdClass {
$data = (object) [];
if ($this->schema) {
$data->schema = $this->schema->get_openapi_schema(
api: $api,
);
}
if (count($this->examples)) {
$data->examples = [];
foreach ($this->examples as $example) {
$data->examples[$example->get_name()] = $example->get_openapi_schema($api);
}
}
if ($this->required) {
$data->required = true;
}
return $data;
}
/**
* Get the schema for this media type.
*
* @return type_base
*/
public function get_schema(): type_base {
return $this->schema;
}
/**
* Get the mimetype for this media type.
*
* @return string
*/
public function get_mimetype(): string {
return static::get_encoding();
}
/**
* Get the encoding for this media type.
*
* @return string
*/
abstract public static function get_encoding(): string;
/**
* Whether this query parameter is required.
*
* @return bool
*/
public function is_required(): bool {
return $this->required;
}
}