backend.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. )
  7. var (
  8. errNoType = errors.New("backend: no type")
  9. errNoName = errors.New("backend: no name")
  10. errTypeRegistered = errors.New("backend: already registered")
  11. )
  12. type initFunc func(context.Context) (interface{}, error)
  13. type registeredBackend struct {
  14. name string
  15. backendType string
  16. init initFunc
  17. }
  18. var backends = struct {
  19. r []*registeredBackend
  20. }{}
  21. // Register adds a typed backend to the registry
  22. func Register(name string, backendType string, init initFunc) {
  23. if name == "" {
  24. panic(errNoName)
  25. }
  26. if backendType == "" {
  27. panic(errNoType)
  28. }
  29. for _, b := range backends.r {
  30. if b.backendType == backendType {
  31. panic(errTypeRegistered)
  32. }
  33. }
  34. backends.r = append(backends.r, &registeredBackend{
  35. name,
  36. backendType,
  37. init,
  38. })
  39. }
  40. // Get returns the backend registered for a particular type, it returns
  41. // an error if there is no registered backends for the given type.
  42. func Get(ctx context.Context, backendType string) (interface{}, error) {
  43. for _, b := range backends.r {
  44. if b.backendType == backendType {
  45. return b.init(ctx)
  46. }
  47. }
  48. return nil, fmt.Errorf("backend not found for context %q", backendType)
  49. }