mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-14 20:41:15 +08:00
60 lines
1.3 KiB
Go
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()
|
|
}
|