Files
APIPark/gateway/manager.go
T
2024-08-12 21:38:09 +08:00

60 lines
1.3 KiB
Go

package gateway
import (
"fmt"
"github.com/eolinker/eosc"
)
type IFactoryManager interface {
Set(name string, factory IFactory)
GetClient(name string, config *ClientConfig) (IClientDriver, error)
Drivers() []string
}
var factoryManager = NewFactoryManager()
func NewFactoryManager() IFactoryManager {
return &FactoryManager{factory: eosc.BuildUntyped[string, IFactory]()}
}
type FactoryManager struct {
factory eosc.Untyped[string, IFactory]
}
func (f *FactoryManager) Drivers() []string {
return f.factory.Keys()
}
func (f *FactoryManager) Set(name string, factory IFactory) {
f.factory.Set(name, factory)
}
func (f *FactoryManager) GetClient(name string, config *ClientConfig) (IClientDriver, error) {
factory, ok := f.factory.Get(name)
if !ok {
return nil, fmt.Errorf("client driver %s not found", name)
}
driver, err := factory.Create(config)
if err != nil {
return nil, fmt.Errorf("create client driver error: %w", err)
}
return driver, nil
}
type IFactory interface {
Create(config *ClientConfig) (IClientDriver, error)
}
func Register(name string, factory IFactory) {
factoryManager.Set(name, factory)
}
func GetClient(name string, config *ClientConfig) (IClientDriver, error) {
return factoryManager.GetClient(name, config)
}
func Drivers() []string {
return factoryManager.Drivers()
}