backend.go 958 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. )
  6. var (
  7. ErrNoType = errors.New("backend: no type")
  8. ErrNoName = errors.New("backend: no name")
  9. ErrTypeRegistered = errors.New("backend: already registered")
  10. )
  11. type InitFunc func(context.Context) (interface{}, error)
  12. type Backend struct {
  13. name string
  14. backendType string
  15. init InitFunc
  16. }
  17. var backends = struct {
  18. r []*Backend
  19. }{}
  20. func Register(name string, backendType string, init InitFunc) {
  21. if name == "" {
  22. panic(ErrNoName)
  23. }
  24. if backendType == "" {
  25. panic(ErrNoType)
  26. }
  27. for _, b := range backends.r {
  28. if b.backendType == backendType {
  29. panic(ErrTypeRegistered)
  30. }
  31. }
  32. backends.r = append(backends.r, &Backend{
  33. name,
  34. backendType,
  35. init,
  36. })
  37. }
  38. func Get(ctx context.Context, backendType string) (interface{}, error) {
  39. for _, b := range backends.r {
  40. if b.backendType == backendType {
  41. return b.init(ctx)
  42. }
  43. }
  44. return nil, errors.New("not found")
  45. }