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