358 lines
12 KiB
PHP

<?php
namespace UglyRobot\Infinite_Uploads\Aws\Api;
use UglyRobot\Infinite_Uploads\Aws\Api\Serializer\QuerySerializer;
use UglyRobot\Infinite_Uploads\Aws\Api\Serializer\Ec2ParamBuilder;
use UglyRobot\Infinite_Uploads\Aws\Api\Parser\QueryParser;
/**
* Represents a web service API model.
*/
class Service extends \UglyRobot\Infinite_Uploads\Aws\Api\AbstractModel
{
/** @var callable */
private $apiProvider;
/** @var string */
private $serviceName;
/** @var string */
private $apiVersion;
/** @var Operation[] */
private $operations = [];
/** @var array */
private $paginators = null;
/** @var array */
private $waiters = null;
/**
* @param array $definition
* @param callable $provider
*
* @internal param array $definition Service description
*/
public function __construct(array $definition, callable $provider)
{
static $defaults = ['operations' => [], 'shapes' => [], 'metadata' => []], $defaultMeta = ['apiVersion' => null, 'serviceFullName' => null, 'serviceId' => null, 'endpointPrefix' => null, 'signingName' => null, 'signatureVersion' => null, 'protocol' => null, 'uid' => null];
$definition += $defaults;
$definition['metadata'] += $defaultMeta;
$this->definition = $definition;
$this->apiProvider = $provider;
parent::__construct($definition, new \UglyRobot\Infinite_Uploads\Aws\Api\ShapeMap($definition['shapes']));
if (isset($definition['metadata']['serviceIdentifier'])) {
$this->serviceName = $this->getServiceName();
} else {
$this->serviceName = $this->getEndpointPrefix();
}
$this->apiVersion = $this->getApiVersion();
}
/**
* Creates a request serializer for the provided API object.
*
* @param Service $api API that contains a protocol.
* @param string $endpoint Endpoint to send requests to.
*
* @return callable
* @throws \UnexpectedValueException
*/
public static function createSerializer(\UglyRobot\Infinite_Uploads\Aws\Api\Service $api, $endpoint)
{
static $mapping = ['json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Serializer\\JsonRpcSerializer', 'query' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Serializer\\QuerySerializer', 'rest-json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Serializer\\RestJsonSerializer', 'rest-xml' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Serializer\\RestXmlSerializer'];
$proto = $api->getProtocol();
if (isset($mapping[$proto])) {
return new $mapping[$proto]($api, $endpoint);
}
if ($proto == 'ec2') {
return new \UglyRobot\Infinite_Uploads\Aws\Api\Serializer\QuerySerializer($api, $endpoint, new \UglyRobot\Infinite_Uploads\Aws\Api\Serializer\Ec2ParamBuilder());
}
throw new \UnexpectedValueException('Unknown protocol: ' . $api->getProtocol());
}
/**
* Creates an error parser for the given protocol.
*
* Redundant method signature to preserve backwards compatibility.
*
* @param string $protocol Protocol to parse (e.g., query, json, etc.)
*
* @return callable
* @throws \UnexpectedValueException
*/
public static function createErrorParser($protocol, \UglyRobot\Infinite_Uploads\Aws\Api\Service $api = null)
{
static $mapping = ['json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\ErrorParser\\JsonRpcErrorParser', 'query' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\ErrorParser\\XmlErrorParser', 'rest-json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\ErrorParser\\RestJsonErrorParser', 'rest-xml' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\ErrorParser\\XmlErrorParser', 'ec2' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\ErrorParser\\XmlErrorParser'];
if (isset($mapping[$protocol])) {
return new $mapping[$protocol]($api);
}
throw new \UnexpectedValueException("Unknown protocol: {$protocol}");
}
/**
* Applies the listeners needed to parse client models.
*
* @param Service $api API to create a parser for
* @return callable
* @throws \UnexpectedValueException
*/
public static function createParser(\UglyRobot\Infinite_Uploads\Aws\Api\Service $api)
{
static $mapping = ['json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Parser\\JsonRpcParser', 'query' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Parser\\QueryParser', 'rest-json' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Parser\\RestJsonParser', 'rest-xml' => 'UglyRobot\\Infinite_Uploads\\Aws\\Api\\Parser\\RestXmlParser'];
$proto = $api->getProtocol();
if (isset($mapping[$proto])) {
return new $mapping[$proto]($api);
}
if ($proto == 'ec2') {
return new \UglyRobot\Infinite_Uploads\Aws\Api\Parser\QueryParser($api, null, false);
}
throw new \UnexpectedValueException('Unknown protocol: ' . $api->getProtocol());
}
/**
* Get the full name of the service
*
* @return string
*/
public function getServiceFullName()
{
return $this->definition['metadata']['serviceFullName'];
}
/**
* Get the service id
*
* @return string
*/
public function getServiceId()
{
return $this->definition['metadata']['serviceId'];
}
/**
* Get the API version of the service
*
* @return string
*/
public function getApiVersion()
{
return $this->definition['metadata']['apiVersion'];
}
/**
* Get the API version of the service
*
* @return string
*/
public function getEndpointPrefix()
{
return $this->definition['metadata']['endpointPrefix'];
}
/**
* Get the signing name used by the service.
*
* @return string
*/
public function getSigningName()
{
return $this->definition['metadata']['signingName'] ?: $this->definition['metadata']['endpointPrefix'];
}
/**
* Get the service name.
*
* @return string
*/
public function getServiceName()
{
return $this->definition['metadata']['serviceIdentifier'];
}
/**
* Get the default signature version of the service.
*
* Note: this method assumes "v4" when not specified in the model.
*
* @return string
*/
public function getSignatureVersion()
{
return $this->definition['metadata']['signatureVersion'] ?: 'v4';
}
/**
* Get the protocol used by the service.
*
* @return string
*/
public function getProtocol()
{
return $this->definition['metadata']['protocol'];
}
/**
* Get the uid string used by the service
*
* @return string
*/
public function getUid()
{
return $this->definition['metadata']['uid'];
}
/**
* Check if the description has a specific operation by name.
*
* @param string $name Operation to check by name
*
* @return bool
*/
public function hasOperation($name)
{
return isset($this['operations'][$name]);
}
/**
* Get an operation by name.
*
* @param string $name Operation to retrieve by name
*
* @return Operation
* @throws \InvalidArgumentException If the operation is not found
*/
public function getOperation($name)
{
if (!isset($this->operations[$name])) {
if (!isset($this->definition['operations'][$name])) {
throw new \InvalidArgumentException("Unknown operation: {$name}");
}
$this->operations[$name] = new \UglyRobot\Infinite_Uploads\Aws\Api\Operation($this->definition['operations'][$name], $this->shapeMap);
}
return $this->operations[$name];
}
/**
* Get all of the operations of the description.
*
* @return Operation[]
*/
public function getOperations()
{
$result = [];
foreach ($this->definition['operations'] as $name => $definition) {
$result[$name] = $this->getOperation($name);
}
return $result;
}
/**
* Get all of the error shapes of the service
*
* @return array
*/
public function getErrorShapes()
{
$result = [];
foreach ($this->definition['shapes'] as $name => $definition) {
if (!empty($definition['exception'])) {
$definition['name'] = $name;
$result[] = new \UglyRobot\Infinite_Uploads\Aws\Api\StructureShape($definition, $this->getShapeMap());
}
}
return $result;
}
/**
* Get all of the service metadata or a specific metadata key value.
*
* @param string|null $key Key to retrieve or null to retrieve all metadata
*
* @return mixed Returns the result or null if the key is not found
*/
public function getMetadata($key = null)
{
if (!$key) {
return $this['metadata'];
}
if (isset($this->definition['metadata'][$key])) {
return $this->definition['metadata'][$key];
}
return null;
}
/**
* Gets an associative array of available paginator configurations where
* the key is the name of the paginator, and the value is the paginator
* configuration.
*
* @return array
* @unstable The configuration format of paginators may change in the future
*/
public function getPaginators()
{
if (!isset($this->paginators)) {
$res = call_user_func($this->apiProvider, 'paginator', $this->serviceName, $this->apiVersion);
$this->paginators = isset($res['pagination']) ? $res['pagination'] : [];
}
return $this->paginators;
}
/**
* Determines if the service has a paginator by name.
*
* @param string $name Name of the paginator.
*
* @return bool
*/
public function hasPaginator($name)
{
return isset($this->getPaginators()[$name]);
}
/**
* Retrieve a paginator by name.
*
* @param string $name Paginator to retrieve by name. This argument is
* typically the operation name.
* @return array
* @throws \UnexpectedValueException if the paginator does not exist.
* @unstable The configuration format of paginators may change in the future
*/
public function getPaginatorConfig($name)
{
static $defaults = ['input_token' => null, 'output_token' => null, 'limit_key' => null, 'result_key' => null, 'more_results' => null];
if ($this->hasPaginator($name)) {
return $this->paginators[$name] + $defaults;
}
throw new \UnexpectedValueException("There is no {$name} " . "paginator defined for the {$this->serviceName} service.");
}
/**
* Gets an associative array of available waiter configurations where the
* key is the name of the waiter, and the value is the waiter
* configuration.
*
* @return array
*/
public function getWaiters()
{
if (!isset($this->waiters)) {
$res = call_user_func($this->apiProvider, 'waiter', $this->serviceName, $this->apiVersion);
$this->waiters = isset($res['waiters']) ? $res['waiters'] : [];
}
return $this->waiters;
}
/**
* Determines if the service has a waiter by name.
*
* @param string $name Name of the waiter.
*
* @return bool
*/
public function hasWaiter($name)
{
return isset($this->getWaiters()[$name]);
}
/**
* Get a waiter configuration by name.
*
* @param string $name Name of the waiter by name.
*
* @return array
* @throws \UnexpectedValueException if the waiter does not exist.
*/
public function getWaiterConfig($name)
{
// Error if the waiter is not defined
if ($this->hasWaiter($name)) {
return $this->waiters[$name];
}
throw new \UnexpectedValueException("There is no {$name} waiter " . "defined for the {$this->serviceName} service.");
}
/**
* Get the shape map used by the API.
*
* @return ShapeMap
*/
public function getShapeMap()
{
return $this->shapeMap;
}
}