53 lines
997 B
Go
53 lines
997 B
Go
|
package protocol
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
type Registry struct {
|
||
|
protocols map[Identifier]Protocol
|
||
|
}
|
||
|
|
||
|
func (r *Registry) Register(protocol Protocol) {
|
||
|
r.protocols[protocol.Identifier()] = protocol
|
||
|
}
|
||
|
|
||
|
func (r *Registry) Availables(ctx context.Context, addr string) ([]Protocol, error) {
|
||
|
availables := make([]Protocol, 0)
|
||
|
for _, proto := range r.protocols {
|
||
|
available, err := proto.Available(ctx, addr)
|
||
|
if err != nil {
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
if available != nil {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
availables = append(availables, proto)
|
||
|
}
|
||
|
return availables, nil
|
||
|
}
|
||
|
|
||
|
func NewRegistry() *Registry {
|
||
|
return &Registry{
|
||
|
protocols: make(map[Identifier]Protocol),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var defaultRegistry = NewRegistry()
|
||
|
|
||
|
func DefaultRegistry() *Registry {
|
||
|
return defaultRegistry
|
||
|
}
|
||
|
|
||
|
func Register(protocol Protocol) {
|
||
|
defaultRegistry.Register(protocol)
|
||
|
}
|
||
|
|
||
|
func Availables(ctx context.Context, addr string) ([]Protocol, error) {
|
||
|
return defaultRegistry.Availables(ctx, addr)
|
||
|
}
|