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