exchange/pool.go

50 lines
961 B
Go
Raw Normal View History

2024-06-25 16:59:56 +00:00
package exchange
import (
"fmt"
"github.com/spf13/viper"
"sync"
)
var (
exchangeFactory = map[string]NewExchangeFn{}
exchangeMutex sync.Mutex
exchanges = map[string]Exchange{}
)
type NewExchangeFn func(cfg Config, cltName string) (t Exchange, err error)
func RegisterExchange(name string, fn NewExchangeFn) {
exchangeFactory[name] = fn
}
func NewExchange(name string, cfg Config, cltName string) (ex Exchange, err error) {
exchangeMutex.Lock()
defer exchangeMutex.Unlock()
if cfg.GetBool("share_exchange") {
v, ok := exchanges[cltName]
if ok {
ex = v
return
}
defer func() {
if err == nil {
exchanges[cltName] = ex
}
}()
}
fn, ok := exchangeFactory[name]
if !ok {
err = fmt.Errorf("no such exchange %s", name)
return
}
ex, err = fn(cfg, cltName)
return
}
func NewExchangeViper(name, cltName string) (ex Exchange, err error) {
cfg := WrapViper(viper.GetViper())
return NewExchange(name, cfg, cltName)
}