registry.go 732 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package store
  2. import (
  3. "context"
  4. "encoding/json"
  5. "sort"
  6. "sync"
  7. )
  8. var (
  9. registry map[string]Factory = map[string]Factory{}
  10. regLock sync.RWMutex
  11. )
  12. type Factory interface {
  13. Build(ctx context.Context, config json.RawMessage) (Interface, error)
  14. Valid(config json.RawMessage) error
  15. }
  16. func Register(name string, impl Factory) {
  17. regLock.Lock()
  18. defer regLock.Unlock()
  19. registry[name] = impl
  20. }
  21. func Get(name string) (Factory, bool) {
  22. regLock.RLock()
  23. defer regLock.RUnlock()
  24. result, ok := registry[name]
  25. return result, ok
  26. }
  27. func Methods() []string {
  28. regLock.RLock()
  29. defer regLock.RUnlock()
  30. var result []string
  31. for method := range registry {
  32. result = append(result, method)
  33. }
  34. sort.Strings(result)
  35. return result
  36. }