|
|
|
@ -587,53 +587,7 @@ func (ct *Cointop) loadPortfolioFromConfig() error {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if key == "holdings" {
|
|
|
|
|
holdingsIfc, ok := valueIfc.([]interface{})
|
|
|
|
|
if !ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, itemIfc := range holdingsIfc {
|
|
|
|
|
tupleIfc, ok := itemIfc.([]interface{})
|
|
|
|
|
if !ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if len(tupleIfc) > 4 {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
name, ok := tupleIfc[0].(string)
|
|
|
|
|
if !ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
holdings, err := ct.InterfaceToFloat64(tupleIfc[1])
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buyPrice := 0.0
|
|
|
|
|
if len(tupleIfc) >= 3 {
|
|
|
|
|
parsePrice, err := ct.InterfaceToFloat64(tupleIfc[2])
|
|
|
|
|
if err == nil {
|
|
|
|
|
buyPrice = parsePrice
|
|
|
|
|
} else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buyCurrency := ""
|
|
|
|
|
if len(tupleIfc) >= 4 {
|
|
|
|
|
parseCurrency, ok := tupleIfc[3].(string)
|
|
|
|
|
if ok {
|
|
|
|
|
buyCurrency = parseCurrency
|
|
|
|
|
} else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := ct.SetPortfolioEntry(name, holdings, buyPrice, buyCurrency); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Defer until the end to work around premature-save issue
|
|
|
|
|
} else if key == "compact_notation" {
|
|
|
|
|
ct.State.portfolioCompactNotation = valueIfc.(bool)
|
|
|
|
|
} else {
|
|
|
|
@ -649,6 +603,58 @@ func (ct *Cointop) loadPortfolioFromConfig() error {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Process holdings last because it causes a ct.Save()
|
|
|
|
|
if valueIfc, ok := ct.config.Portfolio["holdings"]; ok {
|
|
|
|
|
if holdingsIfc, ok := valueIfc.([]interface{}); ok {
|
|
|
|
|
ct.loadPortfolioHoldingsFromConfig(holdingsIfc)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ct *Cointop) loadPortfolioHoldingsFromConfig(holdingsIfc []interface{}) error {
|
|
|
|
|
for _, itemIfc := range holdingsIfc {
|
|
|
|
|
tupleIfc, ok := itemIfc.([]interface{})
|
|
|
|
|
if !ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if len(tupleIfc) > 4 {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
name, ok := tupleIfc[0].(string)
|
|
|
|
|
if !ok {
|
|
|
|
|
continue // was not a string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
holdings, err := ct.InterfaceToFloat64(tupleIfc[1])
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err // was not a float64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buyPrice := 0.0
|
|
|
|
|
if len(tupleIfc) >= 3 {
|
|
|
|
|
if parsePrice, err := ct.InterfaceToFloat64(tupleIfc[2]); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
} else {
|
|
|
|
|
buyPrice = parsePrice
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buyCurrency := ""
|
|
|
|
|
if len(tupleIfc) >= 4 {
|
|
|
|
|
if parseCurrency, ok := tupleIfc[3].(string); !ok {
|
|
|
|
|
return err // was not a string
|
|
|
|
|
} else {
|
|
|
|
|
buyCurrency = parseCurrency
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Watch out - this calls ct.Save() which may save a half-loaded configuration
|
|
|
|
|
if err := ct.SetPortfolioEntry(name, holdings, buyPrice, buyCurrency); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|