forked from openware/pkg
/
forexprovider.go
137 lines (112 loc) · 3.47 KB
/
forexprovider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Package forexprovider utilises foreign exchange API services to manage
// relational FIAT currencies
package forexprovider
import (
"errors"
"github.com/ianeinser/pkg/currency/forexprovider/base"
currencyconverter "github.com/ianeinser/pkg/currency/forexprovider/currencyconverterapi"
"github.com/ianeinser/pkg/currency/forexprovider/currencylayer"
exchangerates "github.com/ianeinser/pkg/currency/forexprovider/exchangeratesapi.io"
fixer "github.com/ianeinser/pkg/currency/forexprovider/fixer.io"
"github.com/ianeinser/pkg/currency/forexprovider/openexchangerates"
)
// GetSupportedForexProviders returns a list of supported forex providers
func GetSupportedForexProviders() []string {
return []string{"CurrencyConverter",
"CurrencyLayer",
"ExchangeRates",
"Fixer",
"OpenExchangeRates"}
}
// NewDefaultFXProvider returns the default forex provider (currencyconverterAPI)
func NewDefaultFXProvider() *ForexProviders {
handler := new(ForexProviders)
provider := new(exchangerates.ExchangeRates)
err := provider.Setup(base.Settings{
PrimaryProvider: true,
Enabled: true,
Name: "ExchangeRates",
})
if err != nil {
panic(err)
}
currencies, _ := provider.GetSupportedCurrencies()
providerBase := base.Provider{
Provider: provider,
SupportedCurrencies: currencies,
}
handler.FXHandler = base.FXHandler{
Primary: providerBase,
}
return handler
}
// SetProvider sets provider to the FX handler
func (f *ForexProviders) SetProvider(b base.IFXProvider) error {
currencies, err := b.GetSupportedCurrencies()
if err != nil {
return err
}
providerBase := base.Provider{
Provider: b,
SupportedCurrencies: currencies,
}
if b.IsPrimaryProvider() {
f.FXHandler = base.FXHandler{
Primary: providerBase,
}
return nil
}
f.FXHandler.Support = append(f.FXHandler.Support, providerBase)
return nil
}
// StartFXService starts the forex provider service and returns a pointer to it
func StartFXService(fxProviders []base.Settings) (*ForexProviders, error) {
handler := new(ForexProviders)
for i := range fxProviders {
switch {
case fxProviders[i].Name == "CurrencyConverter" && fxProviders[i].Enabled:
provider := new(currencyconverter.CurrencyConverter)
err := provider.Setup(fxProviders[i])
if err != nil {
return nil, err
}
handler.SetProvider(provider)
case fxProviders[i].Name == "CurrencyLayer" && fxProviders[i].Enabled:
provider := new(currencylayer.CurrencyLayer)
err := provider.Setup(fxProviders[i])
if err != nil {
return nil, err
}
handler.SetProvider(provider)
case fxProviders[i].Name == "ExchangeRates" && fxProviders[i].Enabled:
provider := new(exchangerates.ExchangeRates)
err := provider.Setup(fxProviders[i])
if err != nil {
return nil, err
}
handler.SetProvider(provider)
case fxProviders[i].Name == "Fixer" && fxProviders[i].Enabled:
provider := new(fixer.Fixer)
err := provider.Setup(fxProviders[i])
if err != nil {
return nil, err
}
handler.SetProvider(provider)
case fxProviders[i].Name == "OpenExchangeRates" && fxProviders[i].Enabled:
provider := new(openexchangerates.OXR)
err := provider.Setup(fxProviders[i])
if err != nil {
return nil, err
}
handler.SetProvider(provider)
}
}
if handler.Primary.Provider == nil {
return nil, errors.New("no primary forex provider enabled")
}
return handler, nil
}
// ForexProviders is a foreign exchange handler type
type ForexProviders struct {
base.FXHandler
}