| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 | 
							- <?php
 
- namespace Aws\Api;
 
- use Aws\Exception\UnresolvedApiException;
 
- /**
 
-  * API providers.
 
-  *
 
-  * An API provider is a function that accepts a type, service, and version and
 
-  * returns an array of API data on success or NULL if no API data can be created
 
-  * for the provided arguments.
 
-  *
 
-  * You can wrap your calls to an API provider with the
 
-  * {@see ApiProvider::resolve} method to ensure that API data is created. If the
 
-  * API data is not created, then the resolve() method will throw a
 
-  * {@see Aws\Exception\UnresolvedApiException}.
 
-  *
 
-  *     use Aws\Api\ApiProvider;
 
-  *     $provider = ApiProvider::defaultProvider();
 
-  *     // Returns an array or NULL.
 
-  *     $data = $provider('api', 's3', '2006-03-01');
 
-  *     // Returns an array or throws.
 
-  *     $data = ApiProvider::resolve($provider, 'api', 'elasticfood', '2020-01-01');
 
-  *
 
-  * You can compose multiple providers into a single provider using
 
-  * {@see Aws\or_chain}. This method accepts providers as arguments and
 
-  * returns a new function that will invoke each provider until a non-null value
 
-  * is returned.
 
-  *
 
-  *     $a = ApiProvider::filesystem(sys_get_temp_dir() . '/aws-beta-models');
 
-  *     $b = ApiProvider::manifest();
 
-  *
 
-  *     $c = \Aws\or_chain($a, $b);
 
-  *     $data = $c('api', 'betaservice', '2015-08-08'); // $a handles this.
 
-  *     $data = $c('api', 's3', '2006-03-01');          // $b handles this.
 
-  *     $data = $c('api', 'invalid', '2014-12-15');     // Neither handles this.
 
-  */
 
- class ApiProvider
 
- {
 
-     /** @var array A map of public API type names to their file suffix. */
 
-     private static $typeMap = [
 
-         'api'       => 'api-2',
 
-         'paginator' => 'paginators-1',
 
-         'waiter'    => 'waiters-2',
 
-         'docs'      => 'docs-2',
 
-     ];
 
-     /** @var array API manifest */
 
-     private $manifest;
 
-     /** @var string The directory containing service models. */
 
-     private $modelsDir;
 
-     /**
 
-      * Resolves an API provider and ensures a non-null return value.
 
-      *
 
-      * @param callable $provider Provider function to invoke.
 
-      * @param string   $type     Type of data ('api', 'waiter', 'paginator').
 
-      * @param string   $service  Service name.
 
-      * @param string   $version  API version.
 
-      *
 
-      * @return array
 
-      * @throws UnresolvedApiException
 
-      */
 
-     public static function resolve(callable $provider, $type, $service, $version)
 
-     {
 
-         // Execute the provider and return the result, if there is one.
 
-         $result = $provider($type, $service, $version);
 
-         if (is_array($result)) {
 
-             if (!isset($result['metadata']['serviceIdentifier'])) {
 
-                 $result['metadata']['serviceIdentifier'] = $service;
 
-             }
 
-             return $result;
 
-         }
 
-         // Throw an exception with a message depending on the inputs.
 
-         if (!isset(self::$typeMap[$type])) {
 
-             $msg = "The type must be one of: " . implode(', ', self::$typeMap);
 
-         } elseif ($service) {
 
-             $msg = "The {$service} service does not have version: {$version}.";
 
-         } else {
 
-             $msg = "You must specify a service name to retrieve its API data.";
 
-         }
 
-         throw new UnresolvedApiException($msg);
 
-     }
 
-     /**
 
-      * Default SDK API provider.
 
-      *
 
-      * This provider loads pre-built manifest data from the `data` directory.
 
-      *
 
-      * @return self
 
-      */
 
-     public static function defaultProvider()
 
-     {
 
-         return new self(__DIR__ . '/../data', \Aws\manifest());
 
-     }
 
-     /**
 
-      * Loads API data after resolving the version to the latest, compatible,
 
-      * available version based on the provided manifest data.
 
-      *
 
-      * Manifest data is essentially an associative array of service names to
 
-      * associative arrays of API version aliases.
 
-      *
 
-      * [
 
-      *   ...
 
-      *   'ec2' => [
 
-      *     'latest'     => '2014-10-01',
 
-      *     '2014-10-01' => '2014-10-01',
 
-      *     '2014-09-01' => '2014-10-01',
 
-      *     '2014-06-15' => '2014-10-01',
 
-      *     ...
 
-      *   ],
 
-      *   'ecs' => [...],
 
-      *   'elasticache' => [...],
 
-      *   ...
 
-      * ]
 
-      *
 
-      * @param string $dir      Directory containing service models.
 
-      * @param array  $manifest The API version manifest data.
 
-      *
 
-      * @return self
 
-      */
 
-     public static function manifest($dir, array $manifest)
 
-     {
 
-         return new self($dir, $manifest);
 
-     }
 
-     /**
 
-      * Loads API data from the specified directory.
 
-      *
 
-      * If "latest" is specified as the version, this provider must glob the
 
-      * directory to find which is the latest available version.
 
-      *
 
-      * @param string $dir Directory containing service models.
 
-      *
 
-      * @return self
 
-      * @throws \InvalidArgumentException if the provided `$dir` is invalid.
 
-      */
 
-     public static function filesystem($dir)
 
-     {
 
-         return new self($dir);
 
-     }
 
-     /**
 
-      * Retrieves a list of valid versions for the specified service.
 
-      *
 
-      * @param string $service Service name
 
-      *
 
-      * @return array
 
-      */
 
-     public function getVersions($service)
 
-     {
 
-         if (!isset($this->manifest)) {
 
-             $this->buildVersionsList($service);
 
-         }
 
-         if (!isset($this->manifest[$service]['versions'])) {
 
-             return [];
 
-         }
 
-         return array_values(array_unique($this->manifest[$service]['versions']));
 
-     }
 
-     /**
 
-      * Execute the provider.
 
-      *
 
-      * @param string $type    Type of data ('api', 'waiter', 'paginator').
 
-      * @param string $service Service name.
 
-      * @param string $version API version.
 
-      *
 
-      * @return array|null
 
-      */
 
-     public function __invoke($type, $service, $version)
 
-     {
 
-         // Resolve the type or return null.
 
-         if (isset(self::$typeMap[$type])) {
 
-             $type = self::$typeMap[$type];
 
-         } else {
 
-             return null;
 
-         }
 
-         // Resolve the version or return null.
 
-         if (!isset($this->manifest)) {
 
-             $this->buildVersionsList($service);
 
-         }
 
-         if (!isset($this->manifest[$service]['versions'][$version])) {
 
-             return null;
 
-         }
 
-         $version = $this->manifest[$service]['versions'][$version];
 
-         $path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json";
 
-         try {
 
-             return \Aws\load_compiled_json($path);
 
-         } catch (\InvalidArgumentException $e) {
 
-             return null;
 
-         }
 
-     }
 
-     /**
 
-      * @param string $modelsDir Directory containing service models.
 
-      * @param array  $manifest  The API version manifest data.
 
-      */
 
-     private function __construct($modelsDir, array $manifest = null)
 
-     {
 
-         $this->manifest = $manifest;
 
-         $this->modelsDir = rtrim($modelsDir, '/');
 
-         if (!is_dir($this->modelsDir)) {
 
-             throw new \InvalidArgumentException(
 
-                 "The specified models directory, {$modelsDir}, was not found."
 
-             );
 
-         }
 
-     }
 
-     /**
 
-      * Build the versions list for the specified service by globbing the dir.
 
-      */
 
-     private function buildVersionsList($service)
 
-     {
 
-         $dir = "{$this->modelsDir}/{$service}/";
 
-         if (!is_dir($dir)) {
 
-             return;
 
-         }
 
-         // Get versions, remove . and .., and sort in descending order.
 
-         $results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']);
 
-         if (!$results) {
 
-             $this->manifest[$service] = ['versions' => []];
 
-         } else {
 
-             $this->manifest[$service] = [
 
-                 'versions' => [
 
-                     'latest' => $results[0]
 
-                 ]
 
-             ];
 
-             $this->manifest[$service]['versions'] += array_combine($results, $results);
 
-         }
 
-     }
 
- }
 
 
  |