1package s3shared 2 3import ( 4 "fmt" 5 6 "github.com/aws/aws-sdk-go/aws/awserr" 7 "github.com/aws/aws-sdk-go/internal/s3shared/arn" 8) 9 10const ( 11 invalidARNErrorErrCode = "InvalidARNError" 12 configurationErrorErrCode = "ConfigurationError" 13) 14 15// InvalidARNError denotes the error for Invalid ARN 16type InvalidARNError struct { 17 message string 18 resource arn.Resource 19 origErr error 20} 21 22// Error returns the InvalidARNError 23func (e InvalidARNError) Error() string { 24 var extra string 25 if e.resource != nil { 26 extra = "ARN: " + e.resource.String() 27 } 28 return awserr.SprintError(e.Code(), e.Message(), extra, e.origErr) 29} 30 31// Code returns the invalid ARN error code 32func (e InvalidARNError) Code() string { 33 return invalidARNErrorErrCode 34} 35 36// Message returns the message for Invalid ARN error 37func (e InvalidARNError) Message() string { 38 return e.message 39} 40 41// OrigErr is the original error wrapped by Invalid ARN Error 42func (e InvalidARNError) OrigErr() error { 43 return e.origErr 44} 45 46// NewInvalidARNError denotes invalid arn error 47func NewInvalidARNError(resource arn.Resource, err error) InvalidARNError { 48 return InvalidARNError{ 49 message: "invalid ARN", 50 origErr: err, 51 resource: resource, 52 } 53} 54 55// NewInvalidARNWithCustomEndpointError ARN not supported for custom clients endpoints 56func NewInvalidARNWithCustomEndpointError(resource arn.Resource, err error) InvalidARNError { 57 return InvalidARNError{ 58 message: "resource ARN not supported with custom client endpoints", 59 origErr: err, 60 resource: resource, 61 } 62} 63 64// NewInvalidARNWithUnsupportedPartitionError ARN not supported for the target partition 65func NewInvalidARNWithUnsupportedPartitionError(resource arn.Resource, err error) InvalidARNError { 66 return InvalidARNError{ 67 message: "resource ARN not supported for the target ARN partition", 68 origErr: err, 69 resource: resource, 70 } 71} 72 73// NewInvalidARNWithFIPSError ARN not supported for FIPS region 74func NewInvalidARNWithFIPSError(resource arn.Resource, err error) InvalidARNError { 75 return InvalidARNError{ 76 message: "resource ARN not supported for FIPS region", 77 resource: resource, 78 origErr: err, 79 } 80} 81 82// ConfigurationError is used to denote a client configuration error 83type ConfigurationError struct { 84 message string 85 resource arn.Resource 86 clientPartitionID string 87 clientRegion string 88 origErr error 89} 90 91// Error returns the Configuration error string 92func (e ConfigurationError) Error() string { 93 extra := fmt.Sprintf("ARN: %s, client partition: %s, client region: %s", 94 e.resource, e.clientPartitionID, e.clientRegion) 95 96 return awserr.SprintError(e.Code(), e.Message(), extra, e.origErr) 97} 98 99// Code returns configuration error's error-code 100func (e ConfigurationError) Code() string { 101 return configurationErrorErrCode 102} 103 104// Message returns the configuration error message 105func (e ConfigurationError) Message() string { 106 return e.message 107} 108 109// OrigErr is the original error wrapped by Configuration Error 110func (e ConfigurationError) OrigErr() error { 111 return e.origErr 112} 113 114// NewClientPartitionMismatchError stub 115func NewClientPartitionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 116 return ConfigurationError{ 117 message: "client partition does not match provided ARN partition", 118 origErr: err, 119 resource: resource, 120 clientPartitionID: clientPartitionID, 121 clientRegion: clientRegion, 122 } 123} 124 125// NewClientRegionMismatchError denotes cross region access error 126func NewClientRegionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 127 return ConfigurationError{ 128 message: "client region does not match provided ARN region", 129 origErr: err, 130 resource: resource, 131 clientPartitionID: clientPartitionID, 132 clientRegion: clientRegion, 133 } 134} 135 136// NewFailedToResolveEndpointError denotes endpoint resolving error 137func NewFailedToResolveEndpointError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 138 return ConfigurationError{ 139 message: "endpoint resolver failed to find an endpoint for the provided ARN region", 140 origErr: err, 141 resource: resource, 142 clientPartitionID: clientPartitionID, 143 clientRegion: clientRegion, 144 } 145} 146 147// NewClientConfiguredForFIPSError denotes client config error for unsupported cross region FIPS access 148func NewClientConfiguredForFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 149 return ConfigurationError{ 150 message: "client configured for fips but cross-region resource ARN provided", 151 origErr: err, 152 resource: resource, 153 clientPartitionID: clientPartitionID, 154 clientRegion: clientRegion, 155 } 156} 157 158// NewClientConfiguredForAccelerateError denotes client config error for unsupported S3 accelerate 159func NewClientConfiguredForAccelerateError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 160 return ConfigurationError{ 161 message: "client configured for S3 Accelerate but is not supported with resource ARN", 162 origErr: err, 163 resource: resource, 164 clientPartitionID: clientPartitionID, 165 clientRegion: clientRegion, 166 } 167} 168 169// NewClientConfiguredForCrossRegionFIPSError denotes client config error for unsupported cross region FIPS request 170func NewClientConfiguredForCrossRegionFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 171 return ConfigurationError{ 172 message: "client configured for FIPS with cross-region enabled but is supported with cross-region resource ARN", 173 origErr: err, 174 resource: resource, 175 clientPartitionID: clientPartitionID, 176 clientRegion: clientRegion, 177 } 178} 179 180// NewClientConfiguredForDualStackError denotes client config error for unsupported S3 Dual-stack 181func NewClientConfiguredForDualStackError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { 182 return ConfigurationError{ 183 message: "client configured for S3 Dual-stack but is not supported with resource ARN", 184 origErr: err, 185 resource: resource, 186 clientPartitionID: clientPartitionID, 187 clientRegion: clientRegion, 188 } 189} 190