-
Notifications
You must be signed in to change notification settings - Fork 1
/
holdings.go
74 lines (68 loc) · 2.19 KB
/
holdings.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
package main
import (
"strings"
"github.com/shopspring/decimal"
"github.com/will7200/go-crypto-sync/internal/providers"
)
type HoldingsCmd struct {
Holdings []string `arg name:"holding-accounts" help:"Holdings to analyze. specify all to use all listed in your config file"`
}
func (s *HoldingsCmd) Run(ctx *Context) error {
log := ctx.SugaredLogger.Named("holdings")
var (
pricingData providers.Price
)
allHoldings := make(providers.Holdings, 0, 2)
if len(s.Holdings) == 1 && s.Holdings[0] == "all" {
s.Holdings = []string{}
for key, _ := range ctx.Config.Holdings {
s.Holdings = append(s.Holdings, key)
}
}
for _, holding := range s.Holdings {
log.Info("Fetching holdings from ", strings.Trim(holding, ""))
holdingsProvider, err := providers.GetAccountProvider(holding)
if err != nil {
log.Warnf("Skipping holding %s since provider doesn't exist", holding)
continue
}
account, err := holdingsProvider.Open(providers.Config{Logger: ctx.Logger.Named("provider").Named(holding), Config: ctx.Config}, ctx.Config.Holdings[holding])
if err != nil {
return err
}
uHolding, err := account.(providers.Account).GetHoldings()
if err != nil {
return err
}
allHoldings = append(allHoldings, uHolding...)
}
log.Infof("setting pricing data provider to %s", ctx.Config.PriceDataSource)
pricingData = getPricingProvider(ctx)
for _, holding := range allHoldings.MapReduce() {
log.Debugf("Fetching %s", holding.CurrencySymbolName())
name := holding.CurrencyName()
if len(name) == 0 {
name = holding.CurrencySymbolName()
}
if holding.CurrencySymbolName() == ctx.Config.DestinationCurrencyAs {
log.Infof("Holding=%s, Quantity=%s, TotalValue=%s", name, holding.TotalShares, holding.TotalShares)
continue
}
p, err := pricingData.GetExchange(holding.CurrencySymbolName(), ctx.Config.DestinationCurrencyAs)
if err != nil {
log.Error(err)
return err
}
pf, err := decimal.NewFromString(p)
if err != nil {
panic(err)
}
quantity, err := decimal.NewFromString(holding.TotalSharesString())
if err != nil {
panic(err)
}
v := pf.Mul(quantity)
log.Infof("Holding=%s, Quantity=%s, TotalValue=%s", name, holding.TotalShares, v.String())
}
return nil
}