src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

provider.go (25435B)


      1 package config
      2 
      3 import (
      4 	"context"
      5 	"io"
      6 	"net/http"
      7 
      8 	"github.com/aws/aws-sdk-go-v2/aws"
      9 	"github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds"
     10 	"github.com/aws/aws-sdk-go-v2/credentials/endpointcreds"
     11 	"github.com/aws/aws-sdk-go-v2/credentials/processcreds"
     12 	"github.com/aws/aws-sdk-go-v2/credentials/ssocreds"
     13 	"github.com/aws/aws-sdk-go-v2/credentials/stscreds"
     14 	"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
     15 	smithybearer "github.com/aws/smithy-go/auth/bearer"
     16 	"github.com/aws/smithy-go/logging"
     17 	"github.com/aws/smithy-go/middleware"
     18 )
     19 
     20 // sharedConfigProfileProvider provides access to the shared config profile
     21 // name external configuration value.
     22 type sharedConfigProfileProvider interface {
     23 	getSharedConfigProfile(ctx context.Context) (string, bool, error)
     24 }
     25 
     26 // getSharedConfigProfile searches the configs for a sharedConfigProfileProvider
     27 // and returns the value if found. Returns an error if a provider fails before a
     28 // value is found.
     29 func getSharedConfigProfile(ctx context.Context, configs configs) (value string, found bool, err error) {
     30 	for _, cfg := range configs {
     31 		if p, ok := cfg.(sharedConfigProfileProvider); ok {
     32 			value, found, err = p.getSharedConfigProfile(ctx)
     33 			if err != nil || found {
     34 				break
     35 			}
     36 		}
     37 	}
     38 	return
     39 }
     40 
     41 // sharedConfigFilesProvider provides access to the shared config filesnames
     42 // external configuration value.
     43 type sharedConfigFilesProvider interface {
     44 	getSharedConfigFiles(ctx context.Context) ([]string, bool, error)
     45 }
     46 
     47 // getSharedConfigFiles searches the configs for a sharedConfigFilesProvider
     48 // and returns the value if found. Returns an error if a provider fails before a
     49 // value is found.
     50 func getSharedConfigFiles(ctx context.Context, configs configs) (value []string, found bool, err error) {
     51 	for _, cfg := range configs {
     52 		if p, ok := cfg.(sharedConfigFilesProvider); ok {
     53 			value, found, err = p.getSharedConfigFiles(ctx)
     54 			if err != nil || found {
     55 				break
     56 			}
     57 		}
     58 	}
     59 
     60 	return
     61 }
     62 
     63 // sharedCredentialsFilesProvider provides access to the shared credentials filesnames
     64 // external configuration value.
     65 type sharedCredentialsFilesProvider interface {
     66 	getSharedCredentialsFiles(ctx context.Context) ([]string, bool, error)
     67 }
     68 
     69 // getSharedCredentialsFiles searches the configs for a sharedCredentialsFilesProvider
     70 // and returns the value if found. Returns an error if a provider fails before a
     71 // value is found.
     72 func getSharedCredentialsFiles(ctx context.Context, configs configs) (value []string, found bool, err error) {
     73 	for _, cfg := range configs {
     74 		if p, ok := cfg.(sharedCredentialsFilesProvider); ok {
     75 			value, found, err = p.getSharedCredentialsFiles(ctx)
     76 			if err != nil || found {
     77 				break
     78 			}
     79 		}
     80 	}
     81 
     82 	return
     83 }
     84 
     85 // customCABundleProvider provides access to the custom CA bundle PEM bytes.
     86 type customCABundleProvider interface {
     87 	getCustomCABundle(ctx context.Context) (io.Reader, bool, error)
     88 }
     89 
     90 // getCustomCABundle searches the configs for a customCABundleProvider
     91 // and returns the value if found. Returns an error if a provider fails before a
     92 // value is found.
     93 func getCustomCABundle(ctx context.Context, configs configs) (value io.Reader, found bool, err error) {
     94 	for _, cfg := range configs {
     95 		if p, ok := cfg.(customCABundleProvider); ok {
     96 			value, found, err = p.getCustomCABundle(ctx)
     97 			if err != nil || found {
     98 				break
     99 			}
    100 		}
    101 	}
    102 
    103 	return
    104 }
    105 
    106 // regionProvider provides access to the region external configuration value.
    107 type regionProvider interface {
    108 	getRegion(ctx context.Context) (string, bool, error)
    109 }
    110 
    111 // getRegion searches the configs for a regionProvider and returns the value
    112 // if found. Returns an error if a provider fails before a value is found.
    113 func getRegion(ctx context.Context, configs configs) (value string, found bool, err error) {
    114 	for _, cfg := range configs {
    115 		if p, ok := cfg.(regionProvider); ok {
    116 			value, found, err = p.getRegion(ctx)
    117 			if err != nil || found {
    118 				break
    119 			}
    120 		}
    121 	}
    122 	return
    123 }
    124 
    125 // IgnoreConfiguredEndpointsProvider is needed to search for all providers
    126 // that provide a flag to disable configured endpoints.
    127 type IgnoreConfiguredEndpointsProvider interface {
    128 	GetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error)
    129 }
    130 
    131 // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured
    132 // endpoints feature.
    133 func GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) {
    134 	for _, cfg := range configs {
    135 		if p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok {
    136 			value, found, err = p.GetIgnoreConfiguredEndpoints(ctx)
    137 			if err != nil || found {
    138 				break
    139 			}
    140 		}
    141 	}
    142 	return
    143 }
    144 
    145 type baseEndpointProvider interface {
    146 	getBaseEndpoint(ctx context.Context) (string, bool, error)
    147 }
    148 
    149 func getBaseEndpoint(ctx context.Context, configs configs) (value string, found bool, err error) {
    150 	for _, cfg := range configs {
    151 		if p, ok := cfg.(baseEndpointProvider); ok {
    152 			value, found, err = p.getBaseEndpoint(ctx)
    153 			if err != nil || found {
    154 				break
    155 			}
    156 		}
    157 	}
    158 	return
    159 }
    160 
    161 type servicesObjectProvider interface {
    162 	getServicesObject(ctx context.Context) (map[string]map[string]string, bool, error)
    163 }
    164 
    165 func getServicesObject(ctx context.Context, configs configs) (value map[string]map[string]string, found bool, err error) {
    166 	for _, cfg := range configs {
    167 		if p, ok := cfg.(servicesObjectProvider); ok {
    168 			value, found, err = p.getServicesObject(ctx)
    169 			if err != nil || found {
    170 				break
    171 			}
    172 		}
    173 	}
    174 	return
    175 }
    176 
    177 // appIDProvider provides access to the sdk app ID value
    178 type appIDProvider interface {
    179 	getAppID(ctx context.Context) (string, bool, error)
    180 }
    181 
    182 func getAppID(ctx context.Context, configs configs) (value string, found bool, err error) {
    183 	for _, cfg := range configs {
    184 		if p, ok := cfg.(appIDProvider); ok {
    185 			value, found, err = p.getAppID(ctx)
    186 			if err != nil || found {
    187 				break
    188 			}
    189 		}
    190 	}
    191 	return
    192 }
    193 
    194 // disableRequestCompressionProvider provides access to the DisableRequestCompression
    195 type disableRequestCompressionProvider interface {
    196 	getDisableRequestCompression(context.Context) (bool, bool, error)
    197 }
    198 
    199 func getDisableRequestCompression(ctx context.Context, configs configs) (value bool, found bool, err error) {
    200 	for _, cfg := range configs {
    201 		if p, ok := cfg.(disableRequestCompressionProvider); ok {
    202 			value, found, err = p.getDisableRequestCompression(ctx)
    203 			if err != nil || found {
    204 				break
    205 			}
    206 		}
    207 	}
    208 	return
    209 }
    210 
    211 // requestMinCompressSizeBytesProvider provides access to the MinCompressSizeBytes
    212 type requestMinCompressSizeBytesProvider interface {
    213 	getRequestMinCompressSizeBytes(context.Context) (int64, bool, error)
    214 }
    215 
    216 func getRequestMinCompressSizeBytes(ctx context.Context, configs configs) (value int64, found bool, err error) {
    217 	for _, cfg := range configs {
    218 		if p, ok := cfg.(requestMinCompressSizeBytesProvider); ok {
    219 			value, found, err = p.getRequestMinCompressSizeBytes(ctx)
    220 			if err != nil || found {
    221 				break
    222 			}
    223 		}
    224 	}
    225 	return
    226 }
    227 
    228 // accountIDEndpointModeProvider provides access to the AccountIDEndpointMode
    229 type accountIDEndpointModeProvider interface {
    230 	getAccountIDEndpointMode(context.Context) (aws.AccountIDEndpointMode, bool, error)
    231 }
    232 
    233 func getAccountIDEndpointMode(ctx context.Context, configs configs) (value aws.AccountIDEndpointMode, found bool, err error) {
    234 	for _, cfg := range configs {
    235 		if p, ok := cfg.(accountIDEndpointModeProvider); ok {
    236 			value, found, err = p.getAccountIDEndpointMode(ctx)
    237 			if err != nil || found {
    238 				break
    239 			}
    240 		}
    241 	}
    242 	return
    243 }
    244 
    245 // requestChecksumCalculationProvider provides access to the RequestChecksumCalculation
    246 type requestChecksumCalculationProvider interface {
    247 	getRequestChecksumCalculation(context.Context) (aws.RequestChecksumCalculation, bool, error)
    248 }
    249 
    250 func getRequestChecksumCalculation(ctx context.Context, configs configs) (value aws.RequestChecksumCalculation, found bool, err error) {
    251 	for _, cfg := range configs {
    252 		if p, ok := cfg.(requestChecksumCalculationProvider); ok {
    253 			value, found, err = p.getRequestChecksumCalculation(ctx)
    254 			if err != nil || found {
    255 				break
    256 			}
    257 		}
    258 	}
    259 	return
    260 }
    261 
    262 // responseChecksumValidationProvider provides access to the ResponseChecksumValidation
    263 type responseChecksumValidationProvider interface {
    264 	getResponseChecksumValidation(context.Context) (aws.ResponseChecksumValidation, bool, error)
    265 }
    266 
    267 func getResponseChecksumValidation(ctx context.Context, configs configs) (value aws.ResponseChecksumValidation, found bool, err error) {
    268 	for _, cfg := range configs {
    269 		if p, ok := cfg.(responseChecksumValidationProvider); ok {
    270 			value, found, err = p.getResponseChecksumValidation(ctx)
    271 			if err != nil || found {
    272 				break
    273 			}
    274 		}
    275 	}
    276 	return
    277 }
    278 
    279 // ec2IMDSRegionProvider provides access to the ec2 imds region
    280 // configuration value
    281 type ec2IMDSRegionProvider interface {
    282 	getEC2IMDSRegion(ctx context.Context) (string, bool, error)
    283 }
    284 
    285 // getEC2IMDSRegion searches the configs for a ec2IMDSRegionProvider and
    286 // returns the value if found. Returns an error if a provider fails before
    287 // a value is found.
    288 func getEC2IMDSRegion(ctx context.Context, configs configs) (region string, found bool, err error) {
    289 	for _, cfg := range configs {
    290 		if provider, ok := cfg.(ec2IMDSRegionProvider); ok {
    291 			region, found, err = provider.getEC2IMDSRegion(ctx)
    292 			if err != nil || found {
    293 				break
    294 			}
    295 		}
    296 	}
    297 	return
    298 }
    299 
    300 // credentialsProviderProvider provides access to the credentials external
    301 // configuration value.
    302 type credentialsProviderProvider interface {
    303 	getCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error)
    304 }
    305 
    306 // getCredentialsProvider searches the configs for a credentialsProviderProvider
    307 // and returns the value if found. Returns an error if a provider fails before a
    308 // value is found.
    309 func getCredentialsProvider(ctx context.Context, configs configs) (p aws.CredentialsProvider, found bool, err error) {
    310 	for _, cfg := range configs {
    311 		if provider, ok := cfg.(credentialsProviderProvider); ok {
    312 			p, found, err = provider.getCredentialsProvider(ctx)
    313 			if err != nil || found {
    314 				break
    315 			}
    316 		}
    317 	}
    318 	return
    319 }
    320 
    321 // credentialsCacheOptionsProvider is an interface for retrieving a function for setting
    322 // the aws.CredentialsCacheOptions.
    323 type credentialsCacheOptionsProvider interface {
    324 	getCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error)
    325 }
    326 
    327 // getCredentialsCacheOptionsProvider is an interface for retrieving a function for setting
    328 // the aws.CredentialsCacheOptions.
    329 func getCredentialsCacheOptionsProvider(ctx context.Context, configs configs) (
    330 	f func(*aws.CredentialsCacheOptions), found bool, err error,
    331 ) {
    332 	for _, config := range configs {
    333 		if p, ok := config.(credentialsCacheOptionsProvider); ok {
    334 			f, found, err = p.getCredentialsCacheOptions(ctx)
    335 			if err != nil || found {
    336 				break
    337 			}
    338 		}
    339 	}
    340 	return
    341 }
    342 
    343 // bearerAuthTokenProviderProvider provides access to the bearer authentication
    344 // token external configuration value.
    345 type bearerAuthTokenProviderProvider interface {
    346 	getBearerAuthTokenProvider(context.Context) (smithybearer.TokenProvider, bool, error)
    347 }
    348 
    349 // getBearerAuthTokenProvider searches the config sources for a
    350 // bearerAuthTokenProviderProvider and returns the value if found. Returns an
    351 // error if a provider fails before a value is found.
    352 func getBearerAuthTokenProvider(ctx context.Context, configs configs) (p smithybearer.TokenProvider, found bool, err error) {
    353 	for _, cfg := range configs {
    354 		if provider, ok := cfg.(bearerAuthTokenProviderProvider); ok {
    355 			p, found, err = provider.getBearerAuthTokenProvider(ctx)
    356 			if err != nil || found {
    357 				break
    358 			}
    359 		}
    360 	}
    361 	return
    362 }
    363 
    364 // bearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for
    365 // setting the smithy-go auth/bearer#TokenCacheOptions.
    366 type bearerAuthTokenCacheOptionsProvider interface {
    367 	getBearerAuthTokenCacheOptions(context.Context) (func(*smithybearer.TokenCacheOptions), bool, error)
    368 }
    369 
    370 // getBearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for
    371 // setting the smithy-go auth/bearer#TokenCacheOptions.
    372 func getBearerAuthTokenCacheOptions(ctx context.Context, configs configs) (
    373 	f func(*smithybearer.TokenCacheOptions), found bool, err error,
    374 ) {
    375 	for _, config := range configs {
    376 		if p, ok := config.(bearerAuthTokenCacheOptionsProvider); ok {
    377 			f, found, err = p.getBearerAuthTokenCacheOptions(ctx)
    378 			if err != nil || found {
    379 				break
    380 			}
    381 		}
    382 	}
    383 	return
    384 }
    385 
    386 // ssoTokenProviderOptionsProvider is an interface for retrieving a function for
    387 // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions.
    388 type ssoTokenProviderOptionsProvider interface {
    389 	getSSOTokenProviderOptions(context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error)
    390 }
    391 
    392 // getSSOTokenProviderOptions is an interface for retrieving a function for
    393 // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions.
    394 func getSSOTokenProviderOptions(ctx context.Context, configs configs) (
    395 	f func(*ssocreds.SSOTokenProviderOptions), found bool, err error,
    396 ) {
    397 	for _, config := range configs {
    398 		if p, ok := config.(ssoTokenProviderOptionsProvider); ok {
    399 			f, found, err = p.getSSOTokenProviderOptions(ctx)
    400 			if err != nil || found {
    401 				break
    402 			}
    403 		}
    404 	}
    405 	return
    406 }
    407 
    408 // ssoTokenProviderOptionsProvider
    409 
    410 // processCredentialOptions is an interface for retrieving a function for setting
    411 // the processcreds.Options.
    412 type processCredentialOptions interface {
    413 	getProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error)
    414 }
    415 
    416 // getProcessCredentialOptions searches the slice of configs and returns the first function found
    417 func getProcessCredentialOptions(ctx context.Context, configs configs) (f func(*processcreds.Options), found bool, err error) {
    418 	for _, config := range configs {
    419 		if p, ok := config.(processCredentialOptions); ok {
    420 			f, found, err = p.getProcessCredentialOptions(ctx)
    421 			if err != nil || found {
    422 				break
    423 			}
    424 		}
    425 	}
    426 	return
    427 }
    428 
    429 // ec2RoleCredentialOptionsProvider is an interface for retrieving a function
    430 // for setting the ec2rolecreds.Provider options.
    431 type ec2RoleCredentialOptionsProvider interface {
    432 	getEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error)
    433 }
    434 
    435 // getEC2RoleCredentialProviderOptions searches the slice of configs and returns the first function found
    436 func getEC2RoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*ec2rolecreds.Options), found bool, err error) {
    437 	for _, config := range configs {
    438 		if p, ok := config.(ec2RoleCredentialOptionsProvider); ok {
    439 			f, found, err = p.getEC2RoleCredentialOptions(ctx)
    440 			if err != nil || found {
    441 				break
    442 			}
    443 		}
    444 	}
    445 	return
    446 }
    447 
    448 // defaultRegionProvider is an interface for retrieving a default region if a region was not resolved from other sources
    449 type defaultRegionProvider interface {
    450 	getDefaultRegion(ctx context.Context) (string, bool, error)
    451 }
    452 
    453 // getDefaultRegion searches the slice of configs and returns the first fallback region found
    454 func getDefaultRegion(ctx context.Context, configs configs) (value string, found bool, err error) {
    455 	for _, config := range configs {
    456 		if p, ok := config.(defaultRegionProvider); ok {
    457 			value, found, err = p.getDefaultRegion(ctx)
    458 			if err != nil || found {
    459 				break
    460 			}
    461 		}
    462 	}
    463 	return
    464 }
    465 
    466 // endpointCredentialOptionsProvider is an interface for retrieving a function for setting
    467 // the endpointcreds.ProviderOptions.
    468 type endpointCredentialOptionsProvider interface {
    469 	getEndpointCredentialOptions(ctx context.Context) (func(*endpointcreds.Options), bool, error)
    470 }
    471 
    472 // getEndpointCredentialProviderOptions searches the slice of configs and returns the first function found
    473 func getEndpointCredentialProviderOptions(ctx context.Context, configs configs) (f func(*endpointcreds.Options), found bool, err error) {
    474 	for _, config := range configs {
    475 		if p, ok := config.(endpointCredentialOptionsProvider); ok {
    476 			f, found, err = p.getEndpointCredentialOptions(ctx)
    477 			if err != nil || found {
    478 				break
    479 			}
    480 		}
    481 	}
    482 	return
    483 }
    484 
    485 // webIdentityRoleCredentialOptionsProvider is an interface for retrieving a function for setting
    486 // the stscreds.WebIdentityRoleProvider.
    487 type webIdentityRoleCredentialOptionsProvider interface {
    488 	getWebIdentityRoleCredentialOptions(ctx context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error)
    489 }
    490 
    491 // getWebIdentityCredentialProviderOptions searches the slice of configs and returns the first function found
    492 func getWebIdentityCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.WebIdentityRoleOptions), found bool, err error) {
    493 	for _, config := range configs {
    494 		if p, ok := config.(webIdentityRoleCredentialOptionsProvider); ok {
    495 			f, found, err = p.getWebIdentityRoleCredentialOptions(ctx)
    496 			if err != nil || found {
    497 				break
    498 			}
    499 		}
    500 	}
    501 	return
    502 }
    503 
    504 // assumeRoleCredentialOptionsProvider is an interface for retrieving a function for setting
    505 // the stscreds.AssumeRoleOptions.
    506 type assumeRoleCredentialOptionsProvider interface {
    507 	getAssumeRoleCredentialOptions(ctx context.Context) (func(*stscreds.AssumeRoleOptions), bool, error)
    508 }
    509 
    510 // getAssumeRoleCredentialProviderOptions searches the slice of configs and returns the first function found
    511 func getAssumeRoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.AssumeRoleOptions), found bool, err error) {
    512 	for _, config := range configs {
    513 		if p, ok := config.(assumeRoleCredentialOptionsProvider); ok {
    514 			f, found, err = p.getAssumeRoleCredentialOptions(ctx)
    515 			if err != nil || found {
    516 				break
    517 			}
    518 		}
    519 	}
    520 	return
    521 }
    522 
    523 // HTTPClient is an HTTP client implementation
    524 type HTTPClient interface {
    525 	Do(*http.Request) (*http.Response, error)
    526 }
    527 
    528 // httpClientProvider is an interface for retrieving HTTPClient
    529 type httpClientProvider interface {
    530 	getHTTPClient(ctx context.Context) (HTTPClient, bool, error)
    531 }
    532 
    533 // getHTTPClient searches the slice of configs and returns the HTTPClient set on configs
    534 func getHTTPClient(ctx context.Context, configs configs) (client HTTPClient, found bool, err error) {
    535 	for _, config := range configs {
    536 		if p, ok := config.(httpClientProvider); ok {
    537 			client, found, err = p.getHTTPClient(ctx)
    538 			if err != nil || found {
    539 				break
    540 			}
    541 		}
    542 	}
    543 	return
    544 }
    545 
    546 // apiOptionsProvider is an interface for retrieving APIOptions
    547 type apiOptionsProvider interface {
    548 	getAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error)
    549 }
    550 
    551 // getAPIOptions searches the slice of configs and returns the APIOptions set on configs
    552 func getAPIOptions(ctx context.Context, configs configs) (apiOptions []func(*middleware.Stack) error, found bool, err error) {
    553 	for _, config := range configs {
    554 		if p, ok := config.(apiOptionsProvider); ok {
    555 			// retrieve APIOptions from configs and set it on cfg
    556 			apiOptions, found, err = p.getAPIOptions(ctx)
    557 			if err != nil || found {
    558 				break
    559 			}
    560 		}
    561 	}
    562 	return
    563 }
    564 
    565 // endpointResolverProvider is an interface for retrieving an aws.EndpointResolver from a configuration source
    566 type endpointResolverProvider interface {
    567 	getEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error)
    568 }
    569 
    570 // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used
    571 // to configure the aws.Config.EndpointResolver value.
    572 func getEndpointResolver(ctx context.Context, configs configs) (f aws.EndpointResolver, found bool, err error) {
    573 	for _, c := range configs {
    574 		if p, ok := c.(endpointResolverProvider); ok {
    575 			f, found, err = p.getEndpointResolver(ctx)
    576 			if err != nil || found {
    577 				break
    578 			}
    579 		}
    580 	}
    581 	return
    582 }
    583 
    584 // endpointResolverWithOptionsProvider is an interface for retrieving an aws.EndpointResolverWithOptions from a configuration source
    585 type endpointResolverWithOptionsProvider interface {
    586 	getEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error)
    587 }
    588 
    589 // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used
    590 // to configure the aws.Config.EndpointResolver value.
    591 func getEndpointResolverWithOptions(ctx context.Context, configs configs) (f aws.EndpointResolverWithOptions, found bool, err error) {
    592 	for _, c := range configs {
    593 		if p, ok := c.(endpointResolverWithOptionsProvider); ok {
    594 			f, found, err = p.getEndpointResolverWithOptions(ctx)
    595 			if err != nil || found {
    596 				break
    597 			}
    598 		}
    599 	}
    600 	return
    601 }
    602 
    603 // loggerProvider is an interface for retrieving a logging.Logger from a configuration source.
    604 type loggerProvider interface {
    605 	getLogger(ctx context.Context) (logging.Logger, bool, error)
    606 }
    607 
    608 // getLogger searches the provided config sources for a logging.Logger that can be used
    609 // to configure the aws.Config.Logger value.
    610 func getLogger(ctx context.Context, configs configs) (l logging.Logger, found bool, err error) {
    611 	for _, c := range configs {
    612 		if p, ok := c.(loggerProvider); ok {
    613 			l, found, err = p.getLogger(ctx)
    614 			if err != nil || found {
    615 				break
    616 			}
    617 		}
    618 	}
    619 	return
    620 }
    621 
    622 // clientLogModeProvider is an interface for retrieving the aws.ClientLogMode from a configuration source.
    623 type clientLogModeProvider interface {
    624 	getClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error)
    625 }
    626 
    627 func getClientLogMode(ctx context.Context, configs configs) (m aws.ClientLogMode, found bool, err error) {
    628 	for _, c := range configs {
    629 		if p, ok := c.(clientLogModeProvider); ok {
    630 			m, found, err = p.getClientLogMode(ctx)
    631 			if err != nil || found {
    632 				break
    633 			}
    634 		}
    635 	}
    636 	return
    637 }
    638 
    639 // retryProvider is an configuration provider for custom Retryer.
    640 type retryProvider interface {
    641 	getRetryer(ctx context.Context) (func() aws.Retryer, bool, error)
    642 }
    643 
    644 func getRetryer(ctx context.Context, configs configs) (v func() aws.Retryer, found bool, err error) {
    645 	for _, c := range configs {
    646 		if p, ok := c.(retryProvider); ok {
    647 			v, found, err = p.getRetryer(ctx)
    648 			if err != nil || found {
    649 				break
    650 			}
    651 		}
    652 	}
    653 	return
    654 }
    655 
    656 // logConfigurationWarningsProvider is an configuration provider for
    657 // retrieving a boolean indicating whether configuration issues should
    658 // be logged when loading from config sources
    659 type logConfigurationWarningsProvider interface {
    660 	getLogConfigurationWarnings(ctx context.Context) (bool, bool, error)
    661 }
    662 
    663 func getLogConfigurationWarnings(ctx context.Context, configs configs) (v bool, found bool, err error) {
    664 	for _, c := range configs {
    665 		if p, ok := c.(logConfigurationWarningsProvider); ok {
    666 			v, found, err = p.getLogConfigurationWarnings(ctx)
    667 			if err != nil || found {
    668 				break
    669 			}
    670 		}
    671 	}
    672 	return
    673 }
    674 
    675 // ssoCredentialOptionsProvider is an interface for retrieving a function for setting
    676 // the ssocreds.Options.
    677 type ssoCredentialOptionsProvider interface {
    678 	getSSOProviderOptions(context.Context) (func(*ssocreds.Options), bool, error)
    679 }
    680 
    681 func getSSOProviderOptions(ctx context.Context, configs configs) (v func(options *ssocreds.Options), found bool, err error) {
    682 	for _, c := range configs {
    683 		if p, ok := c.(ssoCredentialOptionsProvider); ok {
    684 			v, found, err = p.getSSOProviderOptions(ctx)
    685 			if err != nil || found {
    686 				break
    687 			}
    688 		}
    689 	}
    690 	return v, found, err
    691 }
    692 
    693 type defaultsModeIMDSClientProvider interface {
    694 	getDefaultsModeIMDSClient(context.Context) (*imds.Client, bool, error)
    695 }
    696 
    697 func getDefaultsModeIMDSClient(ctx context.Context, configs configs) (v *imds.Client, found bool, err error) {
    698 	for _, c := range configs {
    699 		if p, ok := c.(defaultsModeIMDSClientProvider); ok {
    700 			v, found, err = p.getDefaultsModeIMDSClient(ctx)
    701 			if err != nil || found {
    702 				break
    703 			}
    704 		}
    705 	}
    706 	return v, found, err
    707 }
    708 
    709 type defaultsModeProvider interface {
    710 	getDefaultsMode(context.Context) (aws.DefaultsMode, bool, error)
    711 }
    712 
    713 func getDefaultsMode(ctx context.Context, configs configs) (v aws.DefaultsMode, found bool, err error) {
    714 	for _, c := range configs {
    715 		if p, ok := c.(defaultsModeProvider); ok {
    716 			v, found, err = p.getDefaultsMode(ctx)
    717 			if err != nil || found {
    718 				break
    719 			}
    720 		}
    721 	}
    722 	return v, found, err
    723 }
    724 
    725 type retryMaxAttemptsProvider interface {
    726 	GetRetryMaxAttempts(context.Context) (int, bool, error)
    727 }
    728 
    729 func getRetryMaxAttempts(ctx context.Context, configs configs) (v int, found bool, err error) {
    730 	for _, c := range configs {
    731 		if p, ok := c.(retryMaxAttemptsProvider); ok {
    732 			v, found, err = p.GetRetryMaxAttempts(ctx)
    733 			if err != nil || found {
    734 				break
    735 			}
    736 		}
    737 	}
    738 	return v, found, err
    739 }
    740 
    741 type retryModeProvider interface {
    742 	GetRetryMode(context.Context) (aws.RetryMode, bool, error)
    743 }
    744 
    745 func getRetryMode(ctx context.Context, configs configs) (v aws.RetryMode, found bool, err error) {
    746 	for _, c := range configs {
    747 		if p, ok := c.(retryModeProvider); ok {
    748 			v, found, err = p.GetRetryMode(ctx)
    749 			if err != nil || found {
    750 				break
    751 			}
    752 		}
    753 	}
    754 	return v, found, err
    755 }
    756 
    757 func getAuthSchemePreference(ctx context.Context, configs configs) ([]string, bool) {
    758 	type provider interface {
    759 		getAuthSchemePreference() ([]string, bool)
    760 	}
    761 
    762 	for _, cfg := range configs {
    763 		if p, ok := cfg.(provider); ok {
    764 			if v, ok := p.getAuthSchemePreference(); ok {
    765 				return v, true
    766 			}
    767 		}
    768 	}
    769 	return nil, false
    770 }
    771 
    772 type serviceOptionsProvider interface {
    773 	getServiceOptions(ctx context.Context) ([]func(string, any), bool, error)
    774 }
    775 
    776 func getServiceOptions(ctx context.Context, configs configs) (v []func(string, any), found bool, err error) {
    777 	for _, c := range configs {
    778 		if p, ok := c.(serviceOptionsProvider); ok {
    779 			v, found, err = p.getServiceOptions(ctx)
    780 			if err != nil || found {
    781 				break
    782 			}
    783 		}
    784 	}
    785 	return v, found, err
    786 }