chain.go 738 B

12345678910111213141516171819202122232425262728293031323334
  1. package providers
  2. import (
  3. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
  4. )
  5. type Provider interface {
  6. Retrieve() (auth.Credential, error)
  7. }
  8. // NewChainProvider will attempt to use its given providers in the order
  9. // in which they're provided. It will return credentials for the first
  10. // provider that doesn't return an error.
  11. func NewChainProvider(providers []Provider) Provider {
  12. return &ChainProvider{
  13. Providers: providers,
  14. }
  15. }
  16. type ChainProvider struct {
  17. Providers []Provider
  18. }
  19. func (p *ChainProvider) Retrieve() (auth.Credential, error) {
  20. var lastErr error
  21. for _, provider := range p.Providers {
  22. creds, err := provider.Retrieve()
  23. if err == nil {
  24. return creds, nil
  25. }
  26. lastErr = err
  27. }
  28. return nil, lastErr
  29. }