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