registry.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package registry
  2. import (
  3. "context"
  4. "reflect"
  5. "sort"
  6. )
  7. type Descriptor struct {
  8. Name string
  9. Instance Service
  10. InitPriority Priority
  11. }
  12. var services []*Descriptor
  13. func RegisterService(instance Service) {
  14. services = append(services, &Descriptor{
  15. Name: reflect.TypeOf(instance).Elem().Name(),
  16. Instance: instance,
  17. InitPriority: Low,
  18. })
  19. }
  20. func Register(descriptor *Descriptor) {
  21. services = append(services, descriptor)
  22. }
  23. func GetServices() []*Descriptor {
  24. sort.Slice(services, func(i, j int) bool {
  25. return services[i].InitPriority > services[j].InitPriority
  26. })
  27. return services
  28. }
  29. type Service interface {
  30. Init() error
  31. }
  32. // Useful for alerting service
  33. type CanBeDisabled interface {
  34. IsDisabled() bool
  35. }
  36. type BackgroundService interface {
  37. Run(ctx context.Context) error
  38. }
  39. type HasInitPriority interface {
  40. GetInitPriority() Priority
  41. }
  42. func IsDisabled(srv Service) bool {
  43. canBeDisabled, ok := srv.(CanBeDisabled)
  44. return ok && canBeDisabled.IsDisabled()
  45. }
  46. type Priority int
  47. const (
  48. High Priority = 100
  49. Low Priority = 0
  50. )