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