75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
package drivers
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/driver"
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/driver/arbitrum"
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/driver/ethereum"
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/driver/tron"
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/shared"
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
"github.com/tech/sendico/pkg/mlogger"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Registry maps configured network keys to chain drivers.
|
|
type Registry struct {
|
|
byNetwork map[string]driver.Driver
|
|
}
|
|
|
|
// NewRegistry selects drivers for the configured networks.
|
|
func NewRegistry(logger mlogger.Logger, networks []shared.Network) (*Registry, error) {
|
|
if logger == nil {
|
|
return nil, merrors.InvalidArgument("driver registry: logger is required")
|
|
}
|
|
result := &Registry{byNetwork: map[string]driver.Driver{}}
|
|
for _, network := range networks {
|
|
name := strings.ToLower(strings.TrimSpace(network.Name))
|
|
if name == "" {
|
|
continue
|
|
}
|
|
chainDriver, err := resolveDriver(logger, name)
|
|
if err != nil {
|
|
logger.Error("Unsupported chain driver", zap.String("network", name), zap.Error(err))
|
|
return nil, err
|
|
}
|
|
result.byNetwork[name] = chainDriver
|
|
}
|
|
if len(result.byNetwork) == 0 {
|
|
return nil, merrors.InvalidArgument("driver registry: no supported networks configured")
|
|
}
|
|
logger.Info("Chain drivers configured", zap.Int("count", len(result.byNetwork)))
|
|
return result, nil
|
|
}
|
|
|
|
// Driver resolves a driver for the provided network key.
|
|
func (r *Registry) Driver(network string) (driver.Driver, error) {
|
|
if r == nil || len(r.byNetwork) == 0 {
|
|
return nil, merrors.Internal("driver registry is not configured")
|
|
}
|
|
key := strings.ToLower(strings.TrimSpace(network))
|
|
if key == "" {
|
|
return nil, merrors.InvalidArgument("network is required")
|
|
}
|
|
chainDriver, ok := r.byNetwork[key]
|
|
if !ok {
|
|
return nil, merrors.InvalidArgument(fmt.Sprintf("unsupported chain network %s", key))
|
|
}
|
|
return chainDriver, nil
|
|
}
|
|
|
|
func resolveDriver(logger mlogger.Logger, network string) (driver.Driver, error) {
|
|
switch {
|
|
case strings.HasPrefix(network, "tron"):
|
|
return tron.New(logger), nil
|
|
case strings.HasPrefix(network, "arbitrum"):
|
|
return arbitrum.New(logger), nil
|
|
case strings.HasPrefix(network, "ethereum"):
|
|
return ethereum.New(logger), nil
|
|
default:
|
|
return nil, merrors.InvalidArgument("unsupported chain network " + network)
|
|
}
|
|
}
|