registry.go

 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}