backend.go 1001 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 Backend struct {
  14. name string
  15. backendType string
  16. init InitFunc
  17. }
  18. var backends = struct {
  19. r []*Backend
  20. }{}
  21. func Register(name string, backendType string, init InitFunc) {
  22. if name == "" {
  23. panic(ErrNoName)
  24. }
  25. if backendType == "" {
  26. panic(ErrNoType)
  27. }
  28. for _, b := range backends.r {
  29. if b.backendType == backendType {
  30. panic(ErrTypeRegistered)
  31. }
  32. }
  33. backends.r = append(backends.r, &Backend{
  34. name,
  35. backendType,
  36. init,
  37. })
  38. }
  39. func Get(ctx context.Context, backendType string) (interface{}, error) {
  40. for _, b := range backends.r {
  41. if b.backendType == backendType {
  42. return b.init(ctx)
  43. }
  44. }
  45. return nil, fmt.Errorf("backend not found for context %q", backendType)
  46. }