61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package payment
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type Registry struct {
|
|
providers map[string]Provider
|
|
}
|
|
|
|
func NewRegistry(providers ...Provider) (*Registry, error) {
|
|
registry := &Registry{providers: make(map[string]Provider, len(providers))}
|
|
for _, provider := range providers {
|
|
if provider == nil {
|
|
return nil, fmt.Errorf("payment provider is nil")
|
|
}
|
|
id := strings.TrimSpace(provider.Descriptor().ID)
|
|
if id == "" {
|
|
return nil, fmt.Errorf("payment provider id is empty")
|
|
}
|
|
if _, exists := registry.providers[id]; exists {
|
|
return nil, fmt.Errorf("duplicate payment provider %q", id)
|
|
}
|
|
registry.providers[id] = provider
|
|
}
|
|
return registry, nil
|
|
}
|
|
|
|
func (r *Registry) Get(id string) (Provider, bool) {
|
|
if r == nil {
|
|
return nil, false
|
|
}
|
|
provider, ok := r.providers[strings.TrimSpace(id)]
|
|
return provider, ok
|
|
}
|
|
|
|
func (r *Registry) Descriptors() []Descriptor {
|
|
if r == nil {
|
|
return []Descriptor{}
|
|
}
|
|
items := make([]Descriptor, 0, len(r.providers))
|
|
for _, provider := range r.providers {
|
|
items = append(items, provider.Descriptor())
|
|
}
|
|
sort.Slice(items, func(i, j int) bool { return items[i].ID < items[j].ID })
|
|
return items
|
|
}
|
|
|
|
func (r *Registry) Providers() []Provider {
|
|
if r == nil {
|
|
return nil
|
|
}
|
|
items := make([]Provider, 0, len(r.providers))
|
|
for _, provider := range r.providers {
|
|
items = append(items, provider)
|
|
}
|
|
return items
|
|
}
|