1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

WTF-897 Exchange Rate improvements

Allows the user to set the precision for their exchange rate values.

Config setting:
```
exchangerates:
  precision: 3
```

Default is `7`.

Also aligns converted values along the decimal place for improved
aesthetics.

Signed-off-by: Chris Cummer <chriscummer@me.com>
This commit is contained in:
Chris Cummer
2020-07-23 10:30:31 -07:00
parent a0e34507db
commit fd91a48f58
4 changed files with 123 additions and 12 deletions

View File

@@ -15,6 +15,8 @@ const (
type Settings struct {
common *cfg.Common
precision int `help:"How many decimal places to display." optional:"true"`
rates map[string][]string `help:"Defines what currency rates we want to know about"`
order []string
}
@@ -24,6 +26,8 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
settings := Settings{
common: cfg.NewCommonSettingsFromModule(name, defaultTitle, defaultFocusable, ymlConfig, globalConfig),
precision: ymlConfig.UInt("precision", 7),
rates: map[string][]string{},
order: []string{},
}

View File

@@ -1,11 +1,12 @@
// Package exchangerates
package exchangerates
import (
"fmt"
"regexp"
"github.com/rivo/tview"
"github.com/wtfutil/wtf/view"
"github.com/wtfutil/wtf/wtf"
)
type Widget struct {
@@ -50,22 +51,36 @@ func (widget *Widget) Render() {
/* -------------------- Unexported Functions -------------------- */
func (widget *Widget) content() (string, string, bool) {
out := ""
if widget.err != nil {
out = widget.err.Error()
} else {
for base, rates := range widget.settings.rates {
prefix := fmt.Sprintf("[%s]1 %s[white] = ", widget.settings.common.Colors.Subheading, base)
return widget.CommonSettings().Title, widget.err.Error(), false
}
for idx, cur := range rates {
rate := widget.rates[base][cur]
out := ""
idx := 0
for base, rates := range widget.settings.rates {
for _, cur := range rates {
rate := widget.rates[base][cur]
out += prefix
out += fmt.Sprintf("[%s]%f %s[white]\n", widget.CommonSettings().RowColor(idx), rate, cur)
}
out += fmt.Sprintf(
"[%s]1 %s = %s %s[white]\n",
widget.CommonSettings().RowColor(idx),
base,
widget.formatConversionRate(rate),
cur,
)
idx++
}
}
return widget.CommonSettings().Title, out, false
}
// formatConversionRate takes the raw conversion float and formats it to the precision the
// user specifies in their config (or to the default value)
func (widget *Widget) formatConversionRate(rate float64) string {
rate = wtf.TruncateFloat64(rate, widget.settings.precision)
r, _ := regexp.Compile(`\.?0*$`)
return r.ReplaceAllString(fmt.Sprintf("%10.7f", rate), "")
}