summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/Arn
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
committerAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
commit0c8af4992cb0f7589dcafaad65ada12753c64594 (patch)
tree18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/Arn
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Arn')
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php66
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php10
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/Arn.php188
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php37
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/ArnParser.php69
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php7
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/ObjectLambdaAccessPointArn.php35
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/ResourceTypeAndIdTrait.php30
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php27
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/BucketArnInterface.php12
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/MultiRegionAccessPointArn.php38
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsAccessPointArn.php110
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php12
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsBucketArn.php99
14 files changed, 740 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php
new file mode 100644
index 0000000..e7b88ee
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php
@@ -0,0 +1,66 @@
+<?php
+namespace Aws\Arn;
+
+use Aws\Arn\Exception\InvalidArnException;
+
+/**
+ * @internal
+ */
+class AccessPointArn extends Arn implements AccessPointArnInterface
+{
+ use ResourceTypeAndIdTrait;
+
+ /**
+ * AccessPointArn constructor
+ *
+ * @param $data
+ */
+ public function __construct($data)
+ {
+ parent::__construct($data);
+ static::validate($this->data);
+ }
+
+ public static function parse($string)
+ {
+ $data = parent::parse($string);
+ $data = self::parseResourceTypeAndId($data);
+ $data['accesspoint_name'] = $data['resource_id'];
+ return $data;
+ }
+
+ public function getAccesspointName()
+ {
+ return $this->data['accesspoint_name'];
+ }
+
+ /**
+ * Validation specific to AccessPointArn
+ *
+ * @param array $data
+ */
+ protected static function validate(array $data)
+ {
+ self::validateRegion($data, 'access point ARN');
+ self::validateAccountId($data, 'access point ARN');
+
+ if ($data['resource_type'] !== 'accesspoint') {
+ throw new InvalidArnException("The 6th component of an access point ARN"
+ . " represents the resource type and must be 'accesspoint'.");
+ }
+
+ if (empty($data['resource_id'])) {
+ throw new InvalidArnException("The 7th component of an access point ARN"
+ . " represents the resource ID and must not be empty.");
+ }
+ if (strpos($data['resource_id'], ':') !== false) {
+ throw new InvalidArnException("The resource ID component of an access"
+ . " point ARN must not contain additional components"
+ . " (delimited by ':').");
+ }
+ if (!self::isValidHostLabel($data['resource_id'])) {
+ throw new InvalidArnException("The resource ID in an access point ARN"
+ . " must be a valid host label value.");
+ }
+ }
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php
new file mode 100644
index 0000000..9eb5f2b
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php
@@ -0,0 +1,10 @@
+<?php
+namespace Aws\Arn;
+
+/**
+ * @internal
+ */
+interface AccessPointArnInterface extends ArnInterface
+{
+ public function getAccesspointName();
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/Arn.php b/vendor/aws/aws-sdk-php/src/Arn/Arn.php
new file mode 100644
index 0000000..50367c6
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/Arn.php
@@ -0,0 +1,188 @@
+<?php
+namespace Aws\Arn;
+
+use Aws\Arn\Exception\InvalidArnException;
+
+/**
+ * Amazon Resource Names (ARNs) uniquely identify AWS resources. The Arn class
+ * parses and stores a generic ARN object representation that can apply to any
+ * service resource.
+ *
+ * @internal
+ */
+class Arn implements ArnInterface
+{
+ protected $data;
+ protected $string;
+
+ public static function parse($string)
+ {
+ $data = [
+ 'arn' => null,
+ 'partition' => null,
+ 'service' => null,
+ 'region' => null,
+ 'account_id' => null,
+ 'resource' => null,
+ ];
+
+ $length = strlen($string);
+ $lastDelim = 0;
+ $numComponents = 0;
+ for ($i = 0; $i < $length; $i++) {
+
+ if (($numComponents < 5 && $string[$i] === ':')) {
+ // Split components between delimiters
+ $data[key($data)] = substr($string, $lastDelim, $i - $lastDelim);
+
+ // Do not include delimiter character itself
+ $lastDelim = $i + 1;
+ next($data);
+ $numComponents++;
+ }
+
+ if ($i === $length - 1) {
+ // Put the remainder in the last component.
+ if (in_array($numComponents, [5])) {
+ $data['resource'] = substr($string, $lastDelim);
+ } else {
+ // If there are < 5 components, put remainder in current
+ // component.
+ $data[key($data)] = substr($string, $lastDelim);
+ }
+ }
+ }
+
+ return $data;
+ }
+
+ public function __construct($data)
+ {
+ if (is_array($data)) {
+ $this->data = $data;
+ } elseif (is_string($data)) {
+ $this->data = static::parse($data);
+ } else {
+ throw new InvalidArnException('Constructor accepts a string or an'
+ . ' array as an argument.');
+ }
+
+ static::validate($this->data);
+ }
+
+ public function __toString()
+ {
+ if (!isset($this->string)) {
+ $components = [
+ $this->getPrefix(),
+ $this->getPartition(),
+ $this->getService(),
+ $this->getRegion(),
+ $this->getAccountId(),
+ $this->getResource(),
+ ];
+
+ $this->string = implode(':', $components);
+ }
+ return $this->string;
+ }
+
+ public function getPrefix()
+ {
+ return $this->data['arn'];
+ }
+
+ public function getPartition()
+ {
+ return $this->data['partition'];
+ }
+
+ public function getService()
+ {
+ return $this->data['service'];
+ }
+
+ public function getRegion()
+ {
+ return $this->data['region'];
+ }
+
+ public function getAccountId()
+ {
+ return $this->data['account_id'];
+ }
+
+ public function getResource()
+ {
+ return $this->data['resource'];
+ }
+
+ public function toArray()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Minimally restrictive generic ARN validation
+ *
+ * @param array $data
+ */
+ protected static function validate(array $data)
+ {
+ if ($data['arn'] !== 'arn') {
+ throw new InvalidArnException("The 1st component of an ARN must be"
+ . " 'arn'.");
+ }
+
+ if (empty($data['partition'])) {
+ throw new InvalidArnException("The 2nd component of an ARN"
+ . " represents the partition and must not be empty.");
+ }
+
+ if (empty($data['service'])) {
+ throw new InvalidArnException("The 3rd component of an ARN"
+ . " represents the service and must not be empty.");
+ }
+
+ if (empty($data['resource'])) {
+ throw new InvalidArnException("The 6th component of an ARN"
+ . " represents the resource information and must not be empty."
+ . " Individual service ARNs may include additional delimiters"
+ . " to further qualify resources.");
+ }
+ }
+
+ protected static function validateAccountId($data, $arnName)
+ {
+ if (!self::isValidHostLabel($data['account_id'])) {
+ throw new InvalidArnException("The 5th component of a {$arnName}"
+ . " is required, represents the account ID, and"
+ . " must be a valid host label.");
+ }
+ }
+
+ protected static function validateRegion($data, $arnName)
+ {
+ if (empty($data['region'])) {
+ throw new InvalidArnException("The 4th component of a {$arnName}"
+ . " represents the region and must not be empty.");
+ }
+ }
+
+ /**
+ * Validates whether a string component is a valid host label
+ *
+ * @param $string
+ * @return bool
+ */
+ protected static function isValidHostLabel($string)
+ {
+ if (empty($string) || strlen($string) > 63) {
+ return false;
+ }
+ if ($value = preg_match("/^[a-zA-Z0-9-]+$/", $string)) {
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php
new file mode 100644
index 0000000..c30c6cc
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php
@@ -0,0 +1,37 @@
+<?php
+namespace Aws\Arn;
+
+/**
+ * Amazon Resource Names (ARNs) uniquely identify AWS resources. Classes
+ * implementing ArnInterface parse and store an ARN object representation.
+ *
+ * Valid ARN formats include:
+ *
+ * arn:partition:service:region:account-id:resource-id
+ * arn:partition:service:region:account-id:resource-type/resource-id
+ * arn:partition:service:region:account-id:resource-type:resource-id
+ *
+ * Some components may be omitted, depending on the service and resource type.
+ *
+ * @internal
+ */
+interface ArnInterface
+{
+ public static function parse($string);
+
+ public function __toString();
+
+ public function getPrefix();
+
+ public function getPartition();
+
+ public function getService();
+
+ public function getRegion();
+
+ public function getAccountId();
+
+ public function getResource();
+
+ public function toArray();
+} \ No newline at end of file
diff --git a/vendor/aws/aws-sdk-php/src/Arn/ArnParser.php b/vendor/aws/aws-sdk-php/src/Arn/ArnParser.php
new file mode 100644
index 0000000..331c507
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/ArnParser.php
@@ -0,0 +1,69 @@
+<?php
+namespace Aws\Arn;
+
+use Aws\Arn\S3\AccessPointArn as S3AccessPointArn;
+use Aws\Arn\ObjectLambdaAccessPointArn;
+use Aws\Arn\S3\MultiRegionAccessPointArn;
+use Aws\Arn\S3\OutpostsBucketArn;
+use Aws\Arn\S3\RegionalBucketArn;
+use Aws\Arn\S3\OutpostsAccessPointArn;
+
+/**
+ * This class provides functionality to parse ARN strings and return a
+ * corresponding ARN object. ARN-parsing logic may be subject to change in the
+ * future, so this should not be relied upon for external customer usage.
+ *
+ * @internal
+ */
+class ArnParser
+{
+ /**
+ * @param $string
+ * @return bool
+ */
+ public static function isArn($string)
+ {
+ return $string !== null && strpos($string, 'arn:') === 0;
+ }
+
+ /**
+ * Parses a string and returns an instance of ArnInterface. Returns a
+ * specific type of Arn object if it has a specific class representation
+ * or a generic Arn object if not.
+ *
+ * @param $string
+ * @return ArnInterface
+ */
+ public static function parse($string)
+ {
+ $data = Arn::parse($string);
+ if ($data['service'] === 's3-object-lambda') {
+ return new ObjectLambdaAccessPointArn($string);
+ }
+ $resource = self::explodeResourceComponent($data['resource']);
+ if ($resource[0] === 'outpost') {
+ if (isset($resource[2]) && $resource[2] === 'bucket') {
+ return new OutpostsBucketArn($string);
+ }
+ if (isset($resource[2]) && $resource[2] === 'accesspoint') {
+ return new OutpostsAccessPointArn($string);
+ }
+ }
+ if (empty($data['region'])) {
+ return new MultiRegionAccessPointArn($string);
+ }
+ if ($resource[0] === 'accesspoint') {
+ if ($data['service'] === 's3') {
+ return new S3AccessPointArn($string);
+ }
+ return new AccessPointArn($string);
+ }
+
+ return new Arn($data);
+ }
+
+ private static function explodeResourceComponent($resource)
+ {
+ return preg_split("/[\/:]/", $resource);
+ }
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php b/vendor/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php
new file mode 100644
index 0000000..8690f75
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php
@@ -0,0 +1,7 @@
+<?php
+namespace Aws\Arn\Exception;
+
+/**
+ * Represents a failed attempt to construct an Arn
+ */
+class InvalidArnException extends \RuntimeException {}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/ObjectLambdaAccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/ObjectLambdaAccessPointArn.php
new file mode 100644
index 0000000..48a0667
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/ObjectLambdaAccessPointArn.php
@@ -0,0 +1,35 @@
+<?php
+namespace Aws\Arn;
+
+/**
+ * This class represents an S3 Object bucket ARN, which is in the
+ * following format:
+ *
+ * @internal
+ */
+class ObjectLambdaAccessPointArn extends AccessPointArn
+{
+ /**
+ * Parses a string into an associative array of components that represent
+ * a ObjectLambdaAccessPointArn
+ *
+ * @param $string
+ * @return array
+ */
+ public static function parse($string)
+ {
+ $data = parent::parse($string);
+ return parent::parseResourceTypeAndId($data);
+ }
+
+ /**
+ *
+ * @param array $data
+ */
+ protected static function validate(array $data)
+ {
+ parent::validate($data);
+ self::validateRegion($data, 'S3 Object Lambda ARN');
+ self::validateAccountId($data, 'S3 Object Lambda ARN');
+ }
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/ResourceTypeAndIdTrait.php b/vendor/aws/aws-sdk-php/src/Arn/ResourceTypeAndIdTrait.php
new file mode 100644
index 0000000..424974f
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/ResourceTypeAndIdTrait.php
@@ -0,0 +1,30 @@
+<?php
+namespace Aws\Arn;
+
+/**
+ * @internal
+ */
+trait ResourceTypeAndIdTrait
+{
+ public function getResourceType()
+ {
+ return $this->data['resource_type'];
+ }
+
+ public function getResourceId()
+ {
+ return $this->data['resource_id'];
+ }
+
+ protected static function parseResourceTypeAndId(array $data)
+ {
+ $resourceData = preg_split("/[\/:]/", $data['resource'], 2);
+ $data['resource_type'] = isset($resourceData[0])
+ ? $resourceData[0]
+ : null;
+ $data['resource_id'] = isset($resourceData[1])
+ ? $resourceData[1]
+ : null;
+ return $data;
+ }
+} \ No newline at end of file
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php
new file mode 100644
index 0000000..5841d90
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php
@@ -0,0 +1,27 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\AccessPointArn as BaseAccessPointArn;
+use Aws\Arn\AccessPointArnInterface;
+use Aws\Arn\ArnInterface;
+use Aws\Arn\Exception\InvalidArnException;
+
+/**
+ * @internal
+ */
+class AccessPointArn extends BaseAccessPointArn implements AccessPointArnInterface
+{
+ /**
+ * Validation specific to AccessPointArn
+ *
+ * @param array $data
+ */
+ public static function validate(array $data)
+ {
+ parent::validate($data);
+ if ($data['service'] !== 's3') {
+ throw new InvalidArnException("The 3rd component of an S3 access"
+ . " point ARN represents the region and must be 's3'.");
+ }
+ }
+} \ No newline at end of file
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/BucketArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/S3/BucketArnInterface.php
new file mode 100644
index 0000000..1be0586
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/BucketArnInterface.php
@@ -0,0 +1,12 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\ArnInterface;
+
+/**
+ * @internal
+ */
+interface BucketArnInterface extends ArnInterface
+{
+ public function getBucketName();
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/MultiRegionAccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/S3/MultiRegionAccessPointArn.php
new file mode 100644
index 0000000..401ab0c
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/MultiRegionAccessPointArn.php
@@ -0,0 +1,38 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\Arn;
+use Aws\Arn\ResourceTypeAndIdTrait;
+
+/**
+ * This class represents an S3 multi-region bucket ARN, which is in the
+ * following format:
+ *
+ * @internal
+ */
+class MultiRegionAccessPointArn extends AccessPointArn
+{
+ use ResourceTypeAndIdTrait;
+
+ /**
+ * Parses a string into an associative array of components that represent
+ * a MultiRegionArn
+ *
+ * @param $string
+ * @return array
+ */
+ public static function parse($string)
+ {
+ return parent::parse($string);
+ }
+
+ /**
+ *
+ * @param array $data
+ */
+ public static function validate(array $data)
+ {
+ Arn::validate($data);
+ }
+
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsAccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsAccessPointArn.php
new file mode 100644
index 0000000..b77745d
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsAccessPointArn.php
@@ -0,0 +1,110 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\AccessPointArn as BaseAccessPointArn;
+use Aws\Arn\AccessPointArnInterface;
+use Aws\Arn\Arn;
+use Aws\Arn\Exception\InvalidArnException;
+
+/**
+ * This class represents an S3 Outposts access point ARN, which is in the
+ * following format:
+ *
+ * arn:{partition}:s3-outposts:{region}:{accountId}:outpost:{outpostId}:accesspoint:{accesspointName}
+ *
+ * ':' and '/' can be used interchangeably as delimiters for components after
+ * the account ID.
+ *
+ * @internal
+ */
+class OutpostsAccessPointArn extends BaseAccessPointArn implements
+ AccessPointArnInterface,
+ OutpostsArnInterface
+{
+ public static function parse($string)
+ {
+ $data = parent::parse($string);
+ return self::parseOutpostData($data);
+ }
+
+ public function getOutpostId()
+ {
+ return $this->data['outpost_id'];
+ }
+
+ public function getAccesspointName()
+ {
+ return $this->data['accesspoint_name'];
+ }
+
+ private static function parseOutpostData(array $data)
+ {
+ $resourceData = preg_split("/[\/:]/", $data['resource_id']);
+
+ $data['outpost_id'] = isset($resourceData[0])
+ ? $resourceData[0]
+ : null;
+ $data['accesspoint_type'] = isset($resourceData[1])
+ ? $resourceData[1]
+ : null;
+ $data['accesspoint_name'] = isset($resourceData[2])
+ ? $resourceData[2]
+ : null;
+ if (isset($resourceData[3])) {
+ $data['resource_extra'] = implode(':', array_slice($resourceData, 3));
+ }
+
+ return $data;
+ }
+
+ /**
+ * Validation specific to OutpostsAccessPointArn. Note this uses the base Arn
+ * class validation instead of the direct parent due to it having slightly
+ * differing requirements from its parent.
+ *
+ * @param array $data
+ */
+ public static function validate(array $data)
+ {
+ Arn::validate($data);
+
+ if (($data['service'] !== 's3-outposts')) {
+ throw new InvalidArnException("The 3rd component of an S3 Outposts"
+ . " access point ARN represents the service and must be"
+ . " 's3-outposts'.");
+ }
+
+ self::validateRegion($data, 'S3 Outposts access point ARN');
+ self::validateAccountId($data, 'S3 Outposts access point ARN');
+
+ if (($data['resource_type'] !== 'outpost')) {
+ throw new InvalidArnException("The 6th component of an S3 Outposts"
+ . " access point ARN represents the resource type and must be"
+ . " 'outpost'.");
+ }
+
+ if (!self::isValidHostLabel($data['outpost_id'])) {
+ throw new InvalidArnException("The 7th component of an S3 Outposts"
+ . " access point ARN is required, represents the outpost ID, and"
+ . " must be a valid host label.");
+ }
+
+ if ($data['accesspoint_type'] !== 'accesspoint') {
+ throw new InvalidArnException("The 8th component of an S3 Outposts"
+ . " access point ARN must be 'accesspoint'");
+ }
+
+ if (!self::isValidHostLabel($data['accesspoint_name'])) {
+ throw new InvalidArnException("The 9th component of an S3 Outposts"
+ . " access point ARN is required, represents the accesspoint name,"
+ . " and must be a valid host label.");
+ }
+
+ if (!empty($data['resource_extra'])) {
+ throw new InvalidArnException("An S3 Outposts access point ARN"
+ . " should only have 9 components, delimited by the characters"
+ . " ':' and '/'. '{$data['resource_extra']}' was found after the"
+ . " 9th component.");
+ }
+ }
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php
new file mode 100644
index 0000000..20285e0
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php
@@ -0,0 +1,12 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\ArnInterface;
+
+/**
+ * @internal
+ */
+interface OutpostsArnInterface extends ArnInterface
+{
+ public function getOutpostId();
+}
diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsBucketArn.php b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsBucketArn.php
new file mode 100644
index 0000000..7236a58
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsBucketArn.php
@@ -0,0 +1,99 @@
+<?php
+namespace Aws\Arn\S3;
+
+use Aws\Arn\Arn;
+use Aws\Arn\Exception\InvalidArnException;
+use Aws\Arn\ResourceTypeAndIdTrait;
+
+/**
+ * This class represents an S3 Outposts bucket ARN, which is in the
+ * following format:
+ *
+ * @internal
+ */
+class OutpostsBucketArn extends Arn implements
+ BucketArnInterface,
+ OutpostsArnInterface
+{
+ use ResourceTypeAndIdTrait;
+
+ /**
+ * Parses a string into an associative array of components that represent
+ * a OutpostsBucketArn
+ *
+ * @param $string
+ * @return array
+ */
+ public static function parse($string)
+ {
+ $data = parent::parse($string);
+ $data = self::parseResourceTypeAndId($data);
+ return self::parseOutpostData($data);
+ }
+
+ public function getBucketName()
+ {
+ return $this->data['bucket_name'];
+ }
+
+ public function getOutpostId()
+ {
+ return $this->data['outpost_id'];
+ }
+
+ private static function parseOutpostData(array $data)
+ {
+ $resourceData = preg_split("/[\/:]/", $data['resource_id'], 3);
+
+ $data['outpost_id'] = isset($resourceData[0])
+ ? $resourceData[0]
+ : null;
+ $data['bucket_label'] = isset($resourceData[1])
+ ? $resourceData[1]
+ : null;
+ $data['bucket_name'] = isset($resourceData[2])
+ ? $resourceData[2]
+ : null;
+
+ return $data;
+ }
+
+ /**
+ *
+ * @param array $data
+ */
+ public static function validate(array $data)
+ {
+ Arn::validate($data);
+
+ if (($data['service'] !== 's3-outposts')) {
+ throw new InvalidArnException("The 3rd component of an S3 Outposts"
+ . " bucket ARN represents the service and must be 's3-outposts'.");
+ }
+
+ self::validateRegion($data, 'S3 Outposts bucket ARN');
+ self::validateAccountId($data, 'S3 Outposts bucket ARN');
+
+ if (($data['resource_type'] !== 'outpost')) {
+ throw new InvalidArnException("The 6th component of an S3 Outposts"
+ . " bucket ARN represents the resource type and must be"
+ . " 'outpost'.");
+ }
+
+ if (!self::isValidHostLabel($data['outpost_id'])) {
+ throw new InvalidArnException("The 7th component of an S3 Outposts"
+ . " bucket ARN is required, represents the outpost ID, and"
+ . " must be a valid host label.");
+ }
+
+ if ($data['bucket_label'] !== 'bucket') {
+ throw new InvalidArnException("The 8th component of an S3 Outposts"
+ . " bucket ARN must be 'bucket'");
+ }
+
+ if (empty($data['bucket_name'])) {
+ throw new InvalidArnException("The 9th component of an S3 Outposts"
+ . " bucket ARN represents the bucket name and must not be empty.");
+ }
+ }
+}