core: add dynamic converter

This commit is contained in:
c9s 2024-08-08 17:18:17 +08:00
parent f277b191d2
commit 00e860df26
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54
2 changed files with 41 additions and 12 deletions

View File

@ -17,26 +17,47 @@ type TradeConverter interface {
ConvertTrade(trade types.Trade) (types.Trade, error)
}
type OrderConvertFunc func(order types.Order) (types.Order, error)
type TradeConvertFunc func(trade types.Trade) (types.Trade, error)
type DynamicConverter struct {
orderConverter OrderConvertFunc
tradeConverter TradeConvertFunc
}
func NewDynamicConverter(orderConverter OrderConvertFunc, tradeConverter TradeConvertFunc) *DynamicConverter {
return &DynamicConverter{orderConverter: orderConverter, tradeConverter: tradeConverter}
}
func (c *DynamicConverter) ConvertOrder(order types.Order) (types.Order, error) {
return c.orderConverter(order)
}
func (c *DynamicConverter) ConvertTrade(trade types.Trade) (types.Trade, error) {
return c.tradeConverter(trade)
}
// SymbolConverter converts the symbol to another symbol
type SymbolConverter struct {
fromSymbol, toSymbol string
FromSymbol string `json:"from"`
ToSymbol string `json:"to"`
}
func NewSymbolConverter(fromSymbol, toSymbol string) *SymbolConverter {
return &SymbolConverter{fromSymbol: fromSymbol, toSymbol: toSymbol}
return &SymbolConverter{FromSymbol: fromSymbol, ToSymbol: toSymbol}
}
func (c *SymbolConverter) ConvertOrder(order types.Order) (types.Order, error) {
if order.Symbol == c.fromSymbol {
order.Symbol = c.toSymbol
if order.Symbol == c.FromSymbol {
order.Symbol = c.ToSymbol
}
return order, nil
}
func (c *SymbolConverter) ConvertTrade(trade types.Trade) (types.Trade, error) {
if trade.Symbol == c.fromSymbol {
trade.Symbol = c.toSymbol
if trade.Symbol == c.FromSymbol {
trade.Symbol = c.ToSymbol
}
return trade, nil

View File

@ -13,19 +13,27 @@ import (
)
type ConverterManager struct {
converters []Converter
Converters []Converter `json:"converters,omitempty" yaml:"converters,omitempty"`
}
func (c *ConverterManager) Initialize() error {
for _, converter := range c.Converters {
_ = converter
}
return nil
}
func (c *ConverterManager) AddConverter(converter Converter) {
c.converters = append(c.converters, converter)
c.Converters = append(c.Converters, converter)
}
func (c *ConverterManager) ConvertOrder(order types.Order) types.Order {
if len(c.converters) == 0 {
if len(c.Converters) == 0 {
return order
}
for _, converter := range c.converters {
for _, converter := range c.Converters {
convOrder, err := converter.ConvertOrder(order)
if err != nil {
logrus.WithError(err).Errorf("converter %+v error, order: %s", converter, order.String())
@ -39,11 +47,11 @@ func (c *ConverterManager) ConvertOrder(order types.Order) types.Order {
}
func (c *ConverterManager) ConvertTrade(trade types.Trade) types.Trade {
if len(c.converters) == 0 {
if len(c.Converters) == 0 {
return trade
}
for _, converter := range c.converters {
for _, converter := range c.Converters {
convTrade, err := converter.ConvertTrade(trade)
if err != nil {
logrus.WithError(err).Errorf("converter %+v error, trade: %s", converter, trade.String())