commander.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package core
  2. import (
  3. "sync"
  4. "google.golang.org/grpc"
  5. )
  6. // ServiceRegistryCallback is a callback function for registering services.
  7. type ServiceRegistryCallback func(s *grpc.Server)
  8. // Commander is a feature that accepts commands from external source.
  9. type Commander interface {
  10. Feature
  11. // RegisterService registers a service into this Commander.
  12. RegisterService(ServiceRegistryCallback)
  13. }
  14. type syncCommander struct {
  15. sync.RWMutex
  16. Commander
  17. }
  18. func (c *syncCommander) RegisterService(callback ServiceRegistryCallback) {
  19. c.RLock()
  20. defer c.RUnlock()
  21. if c.Commander == nil {
  22. return
  23. }
  24. c.Commander.RegisterService(callback)
  25. }
  26. func (c *syncCommander) Start() error {
  27. c.RLock()
  28. defer c.RUnlock()
  29. if c.Commander == nil {
  30. return nil
  31. }
  32. return c.Commander.Start()
  33. }
  34. func (c *syncCommander) Close() error {
  35. c.RLock()
  36. defer c.RUnlock()
  37. if c.Commander == nil {
  38. return nil
  39. }
  40. return c.Commander.Close()
  41. }
  42. func (c *syncCommander) Set(commander Commander) {
  43. c.Lock()
  44. defer c.Unlock()
  45. c.Commander = commander
  46. }