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