package discovery import ( "net/url" "os" ) var Default = NewService() type Provider interface { Discover(serviceUrn string) (*url.URL, error) } type Service struct { token string providers []Provider } func (s *Service) Discover(serviceUrn string) (*url.URL, error) { for idx := range s.providers { provider := s.providers[idx] u, err := provider.Discover(serviceUrn) if err == nil { return u, nil } } return nil, os.ErrNotExist } func (s *Service) WithToken(token string) *Service { s.token = token return s } func (s *Service) WithProvider(provider Provider) *Service { s.providers = append(s.providers, provider) return s } func NewService() *Service { return &Service{ providers: []Provider{ NewLocalDiscovery(), }, } }