1// Code generated by smithy-go-codegen DO NOT EDIT.
2
3package cloudhsmv2
4
5import (
6	"context"
7	"github.com/aws/aws-sdk-go-v2/aws"
8	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
9	"github.com/aws/aws-sdk-go-v2/aws/retry"
10	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
11	awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
12	smithy "github.com/aws/smithy-go"
13	"github.com/aws/smithy-go/logging"
14	"github.com/aws/smithy-go/middleware"
15	smithyhttp "github.com/aws/smithy-go/transport/http"
16	"net/http"
17	"time"
18)
19
20const ServiceID = "CloudHSM V2"
21const ServiceAPIVersion = "2017-04-28"
22
23// Client provides the API client to make operations call for AWS CloudHSM V2.
24type Client struct {
25	options Options
26}
27
28// New returns an initialized Client based on the functional options. Provide
29// additional functional options to further configure the behavior of the client,
30// such as changing the client's endpoint or adding custom middleware behavior.
31func New(options Options, optFns ...func(*Options)) *Client {
32	options = options.Copy()
33
34	resolveDefaultLogger(&options)
35
36	resolveRetryer(&options)
37
38	resolveHTTPClient(&options)
39
40	resolveHTTPSignerV4(&options)
41
42	resolveDefaultEndpointConfiguration(&options)
43
44	for _, fn := range optFns {
45		fn(&options)
46	}
47
48	client := &Client{
49		options: options,
50	}
51
52	return client
53}
54
55type Options struct {
56	// Set of options to modify how an operation is invoked. These apply to all
57	// operations invoked for this client. Use functional options on operation call to
58	// modify this list for per operation behavior.
59	APIOptions []func(*middleware.Stack) error
60
61	// Configures the events that will be sent to the configured logger.
62	ClientLogMode aws.ClientLogMode
63
64	// The credentials object to use when signing requests.
65	Credentials aws.CredentialsProvider
66
67	// The endpoint options to be used when attempting to resolve an endpoint.
68	EndpointOptions EndpointResolverOptions
69
70	// The service endpoint resolver.
71	EndpointResolver EndpointResolver
72
73	// Signature Version 4 (SigV4) Signer
74	HTTPSignerV4 HTTPSignerV4
75
76	// The logger writer interface to write logging messages to.
77	Logger logging.Logger
78
79	// The region to send requests to. (Required)
80	Region string
81
82	// Retryer guides how HTTP requests should be retried in case of recoverable
83	// failures. When nil the API client will use a default retryer.
84	Retryer aws.Retryer
85
86	// The HTTP client to invoke API calls with. Defaults to client's default HTTP
87	// implementation if nil.
88	HTTPClient HTTPClient
89}
90
91// WithAPIOptions returns a functional option for setting the Client's APIOptions
92// option.
93func WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) {
94	return func(o *Options) {
95		o.APIOptions = append(o.APIOptions, optFns...)
96	}
97}
98
99// WithEndpointResolver returns a functional option for setting the Client's
100// EndpointResolver option.
101func WithEndpointResolver(v EndpointResolver) func(*Options) {
102	return func(o *Options) {
103		o.EndpointResolver = v
104	}
105}
106
107type HTTPClient interface {
108	Do(*http.Request) (*http.Response, error)
109}
110
111// Copy creates a clone where the APIOptions list is deep copied.
112func (o Options) Copy() Options {
113	to := o
114	to.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions))
115	copy(to.APIOptions, o.APIOptions)
116	return to
117}
118func (c *Client) invokeOperation(ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error) (result interface{}, metadata middleware.Metadata, err error) {
119	ctx = middleware.ClearStackValues(ctx)
120	stack := middleware.NewStack(opID, smithyhttp.NewStackRequest)
121	options := c.options.Copy()
122	for _, fn := range optFns {
123		fn(&options)
124	}
125
126	for _, fn := range stackFns {
127		if err := fn(stack, options); err != nil {
128			return nil, metadata, err
129		}
130	}
131
132	for _, fn := range options.APIOptions {
133		if err := fn(stack); err != nil {
134			return nil, metadata, err
135		}
136	}
137
138	handler := middleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack)
139	result, metadata, err = handler.Handle(ctx, params)
140	if err != nil {
141		err = &smithy.OperationError{
142			ServiceID:     ServiceID,
143			OperationName: opID,
144			Err:           err,
145		}
146	}
147	return result, metadata, err
148}
149
150func resolveDefaultLogger(o *Options) {
151	if o.Logger != nil {
152		return
153	}
154	o.Logger = logging.Nop{}
155}
156
157func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {
158	return middleware.AddSetLoggerMiddleware(stack, o.Logger)
159}
160
161// NewFromConfig returns a new client from the provided config.
162func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {
163	opts := Options{
164		Region:        cfg.Region,
165		HTTPClient:    cfg.HTTPClient,
166		Credentials:   cfg.Credentials,
167		APIOptions:    cfg.APIOptions,
168		Logger:        cfg.Logger,
169		ClientLogMode: cfg.ClientLogMode,
170	}
171	resolveAWSRetryerProvider(cfg, &opts)
172	resolveAWSEndpointResolver(cfg, &opts)
173	return New(opts, optFns...)
174}
175
176func resolveHTTPClient(o *Options) {
177	if o.HTTPClient != nil {
178		return
179	}
180	o.HTTPClient = awshttp.NewBuildableClient()
181}
182
183func resolveRetryer(o *Options) {
184	if o.Retryer != nil {
185		return
186	}
187	o.Retryer = retry.NewStandard()
188}
189
190func resolveAWSRetryerProvider(cfg aws.Config, o *Options) {
191	if cfg.Retryer == nil {
192		return
193	}
194	o.Retryer = cfg.Retryer()
195}
196
197func resolveAWSEndpointResolver(cfg aws.Config, o *Options) {
198	if cfg.EndpointResolver == nil {
199		return
200	}
201	o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, NewDefaultEndpointResolver())
202}
203
204func addClientUserAgent(stack *middleware.Stack) error {
205	return awsmiddleware.AddRequestUserAgentMiddleware(stack)
206}
207
208func addHTTPSignerV4Middleware(stack *middleware.Stack, o Options) error {
209	mw := v4.NewSignHTTPRequestMiddleware(v4.SignHTTPRequestMiddlewareOptions{
210		CredentialsProvider: o.Credentials,
211		Signer:              o.HTTPSignerV4,
212		LogSigning:          o.ClientLogMode.IsSigning(),
213	})
214	return stack.Finalize.Add(mw, middleware.After)
215}
216
217type HTTPSignerV4 interface {
218	SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error
219}
220
221func resolveHTTPSignerV4(o *Options) {
222	if o.HTTPSignerV4 != nil {
223		return
224	}
225	o.HTTPSignerV4 = newDefaultV4Signer(*o)
226}
227
228func newDefaultV4Signer(o Options) *v4.Signer {
229	return v4.NewSigner(func(so *v4.SignerOptions) {
230		so.Logger = o.Logger
231		so.LogSigning = o.ClientLogMode.IsSigning()
232	})
233}
234
235func addRetryMiddlewares(stack *middleware.Stack, o Options) error {
236	mo := retry.AddRetryMiddlewaresOptions{
237		Retryer:          o.Retryer,
238		LogRetryAttempts: o.ClientLogMode.IsRetries(),
239	}
240	return retry.AddRetryMiddlewares(stack, mo)
241}
242
243func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error {
244	return awsmiddleware.AddRequestIDRetrieverMiddleware(stack)
245}
246
247func addResponseErrorMiddleware(stack *middleware.Stack) error {
248	return awshttp.AddResponseErrorMiddleware(stack)
249}
250
251func addRequestResponseLogging(stack *middleware.Stack, o Options) error {
252	return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{
253		LogRequest:          o.ClientLogMode.IsRequest(),
254		LogRequestWithBody:  o.ClientLogMode.IsRequestWithBody(),
255		LogResponse:         o.ClientLogMode.IsResponse(),
256		LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),
257	}, middleware.After)
258}
259