1package azblob
2
3import (
4	"context"
5
6	"github.com/Azure/azure-pipeline-go/pipeline"
7)
8
9// Credential represent any credential type; it is used to create a credential policy Factory.
10type Credential interface {
11	pipeline.Factory
12	credentialMarker()
13}
14
15type credentialFunc pipeline.FactoryFunc
16
17func (f credentialFunc) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {
18	return f(next, po)
19}
20
21// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.
22func (credentialFunc) credentialMarker() {}
23
24//////////////////////////////
25
26// NewAnonymousCredential creates an anonymous credential for use with HTTP(S) requests that read public resource
27// or for use with Shared Access Signatures (SAS).
28func NewAnonymousCredential() Credential {
29	return anonymousCredentialFactory
30}
31
32var anonymousCredentialFactory Credential = &anonymousCredentialPolicyFactory{} // Singleton
33
34// anonymousCredentialPolicyFactory is the credential's policy factory.
35type anonymousCredentialPolicyFactory struct {
36}
37
38// New creates a credential policy object.
39func (f *anonymousCredentialPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {
40	return &anonymousCredentialPolicy{next: next}
41}
42
43// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.
44func (*anonymousCredentialPolicyFactory) credentialMarker() {}
45
46// anonymousCredentialPolicy is the credential's policy object.
47type anonymousCredentialPolicy struct {
48	next pipeline.Policy
49}
50
51// Do implements the credential's policy interface.
52func (p anonymousCredentialPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {
53	// For anonymous credentials, this is effectively a no-op
54	return p.next.Do(ctx, request)
55}
56