router.go 773 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package router
  2. import (
  3. "context"
  4. "sync"
  5. )
  6. type Router interface {
  7. Pick(ctx context.Context) (string, bool)
  8. }
  9. type defaultRouter byte
  10. func (defaultRouter) Pick(ctx context.Context) (string, bool) {
  11. return "", false
  12. }
  13. type syncRouter struct {
  14. sync.RWMutex
  15. Router
  16. }
  17. func (r *syncRouter) Pick(ctx context.Context) (string, bool) {
  18. r.RLock()
  19. defer r.RUnlock()
  20. return r.Router.Pick(ctx)
  21. }
  22. func (r *syncRouter) Set(router Router) {
  23. r.Lock()
  24. defer r.Unlock()
  25. r.Router = router
  26. }
  27. var (
  28. routerInstance = &syncRouter{
  29. Router: defaultRouter(0),
  30. }
  31. )
  32. func RegisterRouter(router Router) {
  33. if router == nil {
  34. panic("Router is nil.")
  35. }
  36. routerInstance.Set(router)
  37. }
  38. func Pick(ctx context.Context) (string, bool) {
  39. return routerInstance.Router.Pick(ctx)
  40. }