1package access
2
3import (
4 "context"
5 "errors"
6 "sync"
7)
8
9var (
10 registry = make(map[string]Constructor)
11 mtx sync.RWMutex
12
13 // ErrNotFound is returned when an access provider is not found.
14 ErrNotFound = errors.New("access provider not found")
15)
16
17// Constructor is a function that returns an access provider.
18type Constructor func(ctx context.Context) (Access, error)
19
20// Register registers an access provider.
21func Register(name string, fn Constructor) {
22 mtx.Lock()
23 defer mtx.Unlock()
24 registry[name] = fn
25}
26
27// New returns a new access provider.
28func New(ctx context.Context, name string) (Access, error) {
29 mtx.RLock()
30 fn, ok := registry[name]
31 mtx.RUnlock()
32
33 if !ok {
34 return nil, ErrNotFound
35 }
36
37 return fn(ctx)
38}
39
40// List returns a list of registered access providers.
41func List() []string {
42 mtx.Lock()
43 defer mtx.Unlock()
44 providers := make([]string, 0)
45 for name := range registry {
46 providers = append(providers, name)
47 }
48 return providers
49}