48 lines
770 B
Go
48 lines
770 B
Go
|
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(),
|
||
|
},
|
||
|
}
|
||
|
}
|