vendor/aws/aws-sdk-php/src/Api/Service.php line 83

Open in your IDE?
  1. <?php
  2. namespace Aws\Api;
  3. /**
  4.  * Represents a web service API model.
  5.  */
  6. class Service extends AbstractModel
  7. {
  8.     /** @var callable */
  9.     private $apiProvider;
  10.     /** @var string */
  11.     private $serviceName;
  12.     /** @var string */
  13.     private $apiVersion;
  14.     /** @var array */
  15.     private $clientContextParams = [];
  16.     /** @var Operation[] */
  17.     private $operations = [];
  18.     /** @var array */
  19.     private $paginators null;
  20.     /** @var array */
  21.     private $waiters null;
  22.     /** @var boolean */
  23.     private $modifiedModel false;
  24.     /**
  25.      * @param array    $definition
  26.      * @param callable $provider
  27.      *
  28.      * @internal param array $definition Service description
  29.      */
  30.     public function __construct(array $definition, callable $provider)
  31.     {
  32.         static $defaults = [
  33.             'operations' => [],
  34.             'shapes'     => [],
  35.             'metadata'   => [],
  36.             'clientContextParams' => []
  37.         ], $defaultMeta = [
  38.             'apiVersion'       => null,
  39.             'serviceFullName'  => null,
  40.             'serviceId'        => null,
  41.             'endpointPrefix'   => null,
  42.             'signingName'      => null,
  43.             'signatureVersion' => null,
  44.             'protocol'         => null,
  45.             'uid'              => null
  46.         ];
  47.         $definition += $defaults;
  48.         $definition['metadata'] += $defaultMeta;
  49.         $this->definition $definition;
  50.         $this->apiProvider $provider;
  51.         parent::__construct($definition, new ShapeMap($definition['shapes']));
  52.         if (isset($definition['metadata']['serviceIdentifier'])) {
  53.             $this->serviceName $this->getServiceName();
  54.         } else {
  55.             $this->serviceName $this->getEndpointPrefix();
  56.         }
  57.         $this->apiVersion $this->getApiVersion();
  58.         if (isset($definition['clientContextParams'])) {
  59.            $this->clientContextParams $definition['clientContextParams'];
  60.         }
  61.     }
  62.     /**
  63.      * Creates a request serializer for the provided API object.
  64.      *
  65.      * @param Service $api      API that contains a protocol.
  66.      * @param string  $endpoint Endpoint to send requests to.
  67.      *
  68.      * @return callable
  69.      * @throws \UnexpectedValueException
  70.      */
  71.     public static function createSerializer(Service $api$endpoint)
  72.     {
  73.         static $mapping = [
  74.             'json'      => Serializer\JsonRpcSerializer::class,
  75.             'query'     => Serializer\QuerySerializer::class,
  76.             'rest-json' => Serializer\RestJsonSerializer::class,
  77.             'rest-xml'  => Serializer\RestXmlSerializer::class
  78.         ];
  79.         $proto $api->getProtocol();
  80.         if (isset($mapping[$proto])) {
  81.             return new $mapping[$proto]($api$endpoint);
  82.         }
  83.         if ($proto == 'ec2') {
  84.             return new Serializer\QuerySerializer($api$endpoint, new Serializer\Ec2ParamBuilder());
  85.         }
  86.         throw new \UnexpectedValueException(
  87.             'Unknown protocol: ' $api->getProtocol()
  88.         );
  89.     }
  90.     /**
  91.      * Creates an error parser for the given protocol.
  92.      *
  93.      * Redundant method signature to preserve backwards compatibility.
  94.      *
  95.      * @param string $protocol Protocol to parse (e.g., query, json, etc.)
  96.      *
  97.      * @return callable
  98.      * @throws \UnexpectedValueException
  99.      */
  100.     public static function createErrorParser($protocol, ?Service $api null)
  101.     {
  102.         static $mapping = [
  103.             'json'      => ErrorParser\JsonRpcErrorParser::class,
  104.             'query'     => ErrorParser\XmlErrorParser::class,
  105.             'rest-json' => ErrorParser\RestJsonErrorParser::class,
  106.             'rest-xml'  => ErrorParser\XmlErrorParser::class,
  107.             'ec2'       => ErrorParser\XmlErrorParser::class
  108.         ];
  109.         if (isset($mapping[$protocol])) {
  110.             return new $mapping[$protocol]($api);
  111.         }
  112.         throw new \UnexpectedValueException("Unknown protocol: $protocol");
  113.     }
  114.     /**
  115.      * Applies the listeners needed to parse client models.
  116.      *
  117.      * @param Service $api API to create a parser for
  118.      * @return callable
  119.      * @throws \UnexpectedValueException
  120.      */
  121.     public static function createParser(Service $api)
  122.     {
  123.         static $mapping = [
  124.             'json'      => Parser\JsonRpcParser::class,
  125.             'query'     => Parser\QueryParser::class,
  126.             'rest-json' => Parser\RestJsonParser::class,
  127.             'rest-xml'  => Parser\RestXmlParser::class
  128.         ];
  129.         $proto $api->getProtocol();
  130.         if (isset($mapping[$proto])) {
  131.             return new $mapping[$proto]($api);
  132.         }
  133.         if ($proto == 'ec2') {
  134.             return new Parser\QueryParser($apinullfalse);
  135.         }
  136.         throw new \UnexpectedValueException(
  137.             'Unknown protocol: ' $api->getProtocol()
  138.         );
  139.     }
  140.     /**
  141.      * Get the full name of the service
  142.      *
  143.      * @return string
  144.      */
  145.     public function getServiceFullName()
  146.     {
  147.         return $this->definition['metadata']['serviceFullName'];
  148.     }
  149.     /**
  150.      * Get the service id
  151.      *
  152.      * @return string
  153.      */
  154.     public function getServiceId()
  155.     {
  156.         return $this->definition['metadata']['serviceId'];
  157.     }
  158.     /**
  159.      * Get the API version of the service
  160.      *
  161.      * @return string
  162.      */
  163.     public function getApiVersion()
  164.     {
  165.         return $this->definition['metadata']['apiVersion'];
  166.     }
  167.     /**
  168.      * Get the API version of the service
  169.      *
  170.      * @return string
  171.      */
  172.     public function getEndpointPrefix()
  173.     {
  174.         return $this->definition['metadata']['endpointPrefix'];
  175.     }
  176.     /**
  177.      * Get the signing name used by the service.
  178.      *
  179.      * @return string
  180.      */
  181.     public function getSigningName()
  182.     {
  183.         return $this->definition['metadata']['signingName']
  184.             ?: $this->definition['metadata']['endpointPrefix'];
  185.     }
  186.     /**
  187.      * Get the service name.
  188.      *
  189.      * @return string
  190.      */
  191.     public function getServiceName()
  192.     {
  193.         return $this->definition['metadata']['serviceIdentifier'] ?? null;
  194.     }
  195.     /**
  196.      * Get the default signature version of the service.
  197.      *
  198.      * Note: this method assumes "v4" when not specified in the model.
  199.      *
  200.      * @return string
  201.      */
  202.     public function getSignatureVersion()
  203.     {
  204.         return $this->definition['metadata']['signatureVersion'] ?: 'v4';
  205.     }
  206.     /**
  207.      * Get the protocol used by the service.
  208.      *
  209.      * @return string
  210.      */
  211.     public function getProtocol()
  212.     {
  213.         return $this->definition['metadata']['protocol'];
  214.     }
  215.     /**
  216.      * Get the uid string used by the service
  217.      *
  218.      * @return string
  219.      */
  220.     public function getUid()
  221.     {
  222.         return $this->definition['metadata']['uid'];
  223.     }
  224.     /**
  225.      * Check if the description has a specific operation by name.
  226.      *
  227.      * @param string $name Operation to check by name
  228.      *
  229.      * @return bool
  230.      */
  231.     public function hasOperation($name)
  232.     {
  233.         return isset($this['operations'][$name]);
  234.     }
  235.     /**
  236.      * Get an operation by name.
  237.      *
  238.      * @param string $name Operation to retrieve by name
  239.      *
  240.      * @return Operation
  241.      * @throws \InvalidArgumentException If the operation is not found
  242.      */
  243.     public function getOperation($name)
  244.     {
  245.         if (!isset($this->operations[$name])) {
  246.             if (!isset($this->definition['operations'][$name])) {
  247.                 throw new \InvalidArgumentException("Unknown operation: $name");
  248.             }
  249.             $this->operations[$name] = new Operation(
  250.                 $this->definition['operations'][$name],
  251.                 $this->shapeMap
  252.             );
  253.         } elseif ($this->modifiedModel) {
  254.             $this->operations[$name] = new Operation(
  255.                 $this->definition['operations'][$name],
  256.                 $this->shapeMap
  257.             );
  258.         }
  259.         return $this->operations[$name];
  260.     }
  261.     /**
  262.      * Get all of the operations of the description.
  263.      *
  264.      * @return Operation[]
  265.      */
  266.     public function getOperations()
  267.     {
  268.         $result = [];
  269.         foreach ($this->definition['operations'] as $name => $definition) {
  270.             $result[$name] = $this->getOperation($name);
  271.         }
  272.         return $result;
  273.     }
  274.     /**
  275.      * Get all of the error shapes of the service
  276.      *
  277.      * @return array
  278.      */
  279.     public function getErrorShapes()
  280.     {
  281.         $result = [];
  282.         foreach ($this->definition['shapes'] as $name => $definition) {
  283.             if (!empty($definition['exception'])) {
  284.                 $definition['name'] = $name;
  285.                 $result[] = new StructureShape($definition$this->getShapeMap());
  286.             }
  287.         }
  288.         return $result;
  289.     }
  290.     /**
  291.      * Get all of the service metadata or a specific metadata key value.
  292.      *
  293.      * @param string|null $key Key to retrieve or null to retrieve all metadata
  294.      *
  295.      * @return mixed Returns the result or null if the key is not found
  296.      */
  297.     public function getMetadata($key null)
  298.     {
  299.         if (!$key) {
  300.             return $this['metadata'];
  301.         }
  302.         if (isset($this->definition['metadata'][$key])) {
  303.             return $this->definition['metadata'][$key];
  304.         }
  305.         return null;
  306.     }
  307.     /**
  308.      * Gets an associative array of available paginator configurations where
  309.      * the key is the name of the paginator, and the value is the paginator
  310.      * configuration.
  311.      *
  312.      * @return array
  313.      * @unstable The configuration format of paginators may change in the future
  314.      */
  315.     public function getPaginators()
  316.     {
  317.         if (!isset($this->paginators)) {
  318.             $res call_user_func(
  319.                 $this->apiProvider,
  320.                 'paginator',
  321.                 $this->serviceName,
  322.                 $this->apiVersion
  323.             );
  324.             $this->paginators = isset($res['pagination'])
  325.                 ? $res['pagination']
  326.                 : [];
  327.         }
  328.         return $this->paginators;
  329.     }
  330.     /**
  331.      * Determines if the service has a paginator by name.
  332.      *
  333.      * @param string $name Name of the paginator.
  334.      *
  335.      * @return bool
  336.      */
  337.     public function hasPaginator($name)
  338.     {
  339.         return isset($this->getPaginators()[$name]);
  340.     }
  341.     /**
  342.      * Retrieve a paginator by name.
  343.      *
  344.      * @param string $name Paginator to retrieve by name. This argument is
  345.      *                     typically the operation name.
  346.      * @return array
  347.      * @throws \UnexpectedValueException if the paginator does not exist.
  348.      * @unstable The configuration format of paginators may change in the future
  349.      */
  350.     public function getPaginatorConfig($name)
  351.     {
  352.         static $defaults = [
  353.             'input_token'  => null,
  354.             'output_token' => null,
  355.             'limit_key'    => null,
  356.             'result_key'   => null,
  357.             'more_results' => null,
  358.         ];
  359.         if ($this->hasPaginator($name)) {
  360.             return $this->paginators[$name] + $defaults;
  361.         }
  362.         throw new \UnexpectedValueException("There is no {$name} "
  363.             "paginator defined for the {$this->serviceName} service.");
  364.     }
  365.     /**
  366.      * Gets an associative array of available waiter configurations where the
  367.      * key is the name of the waiter, and the value is the waiter
  368.      * configuration.
  369.      *
  370.      * @return array
  371.      */
  372.     public function getWaiters()
  373.     {
  374.         if (!isset($this->waiters)) {
  375.             $res call_user_func(
  376.                 $this->apiProvider,
  377.                 'waiter',
  378.                 $this->serviceName,
  379.                 $this->apiVersion
  380.             );
  381.             $this->waiters = isset($res['waiters'])
  382.                 ? $res['waiters']
  383.                 : [];
  384.         }
  385.         return $this->waiters;
  386.     }
  387.     /**
  388.      * Determines if the service has a waiter by name.
  389.      *
  390.      * @param string $name Name of the waiter.
  391.      *
  392.      * @return bool
  393.      */
  394.     public function hasWaiter($name)
  395.     {
  396.         return isset($this->getWaiters()[$name]);
  397.     }
  398.     /**
  399.      * Get a waiter configuration by name.
  400.      *
  401.      * @param string $name Name of the waiter by name.
  402.      *
  403.      * @return array
  404.      * @throws \UnexpectedValueException if the waiter does not exist.
  405.      */
  406.     public function getWaiterConfig($name)
  407.     {
  408.         // Error if the waiter is not defined
  409.         if ($this->hasWaiter($name)) {
  410.             return $this->waiters[$name];
  411.         }
  412.         throw new \UnexpectedValueException("There is no {$name} waiter "
  413.             "defined for the {$this->serviceName} service.");
  414.     }
  415.     /**
  416.      * Get the shape map used by the API.
  417.      *
  418.      * @return ShapeMap
  419.      */
  420.     public function getShapeMap()
  421.     {
  422.         return $this->shapeMap;
  423.     }
  424.     /**
  425.      * Get all the context params of the description.
  426.      *
  427.      * @return array
  428.      */
  429.     public function getClientContextParams()
  430.     {
  431.         return $this->clientContextParams;
  432.     }
  433.     /**
  434.      * Get the service's api provider.
  435.      *
  436.      * @return callable
  437.      */
  438.     public function getProvider()
  439.     {
  440.         return $this->apiProvider;
  441.     }
  442.     /**
  443.      * Get the service's definition.
  444.      *
  445.      * @return callable
  446.      */
  447.     public function getDefinition()
  448.     {
  449.         return $this->definition;
  450.     }
  451.     /**
  452.      * Sets the service's api definition.
  453.      * Intended for internal use only.
  454.      *
  455.      * @return void
  456.      *
  457.      * @internal
  458.      */
  459.     public function setDefinition($definition)
  460.     {
  461.         $this->definition $definition;
  462.         $this->shapeMap = new ShapeMap($definition['shapes']);
  463.         $this->modifiedModel true;
  464.     }
  465.     /**
  466.      * Denotes whether or not a service's definition has
  467.      * been modified.  Intended for internal use only.
  468.      *
  469.      * @return bool
  470.      *
  471.      * @internal
  472.      */
  473.     public function isModifiedModel()
  474.     {
  475.         return $this->modifiedModel;
  476.     }
  477. }