-
Notifications
You must be signed in to change notification settings - Fork 1
/
rates.go
105 lines (96 loc) · 2.39 KB
/
rates.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
package cli
import (
"context"
"fmt"
"os"
"strings"
"text/tabwriter"
"github.com/urfave/cli"
"github.com/zeeraw/riksbank"
"github.com/zeeraw/riksbank/cli/flags"
"github.com/zeeraw/riksbank/date"
)
const (
ratesName = "rates"
ratesUsage = "Lists interest or exchange rates between two dates"
)
func (t *Tool) cmdRates() cli.Command {
return cli.Command{
Name: ratesName,
Usage: ratesUsage,
Action: t.actionRates,
Flags: []cli.Flag{
flags.From,
flags.To,
flags.Aggregate,
flags.Analysis,
flags.Series,
},
}
}
func (t *Tool) actionRates(c *cli.Context) error {
ctx := context.Background()
series := c.StringSlice("series")
if len(series) < 1 {
return fmt.Errorf("need to have at least one series")
}
from, err := date.Parse(c.String("from"))
if err != nil {
return err
}
to, err := date.Parse(c.String("to"))
if err != nil {
return err
}
aggregate, err := riksbank.ParseAggregate(c.String("aggregate"))
if err != nil {
return err
}
analysis, err := riksbank.ParseAggregateAnalysis(aggregate, c.String("analysis"))
if err != nil {
return err
}
req := &riksbank.RatesRequest{
Series: series,
From: from,
To: to,
AggregateMethod: aggregate,
AnalysisMethod: analysis,
}
res, err := t.Riksbank.Rates(ctx, req)
if err != nil {
return err
}
return t.renderRates(req, res)
}
func (t *Tool) renderRates(req *riksbank.RatesRequest, res *riksbank.RatesResponse) error {
const (
rowFmt = "%s\t %s\t %s\t %s\n"
)
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
defer w.Flush()
fmt.Fprintf(os.Stdout, "Ranging from %s to %s\n", formatDate(req.From), formatDate(req.To))
if req.AggregateMethod != riksbank.Daily {
fmt.Fprintf(os.Stdout, "Aggregating %s %s value\n\n", req.AggregateMethod.Name(), req.AnalysisMethod)
}
fmt.Fprintf(os.Stdout, "Series %s\n", strings.Join(req.Series, ", "))
fmt.Fprint(os.Stdout, "\n")
var valueLabel string
switch req.AnalysisMethod {
case riksbank.Mean:
valueLabel = "Mean value"
case riksbank.Min:
valueLabel = "Min value"
case riksbank.Max:
valueLabel = "Max value"
case riksbank.Ultimo:
valueLabel = "Ultimo value"
default:
valueLabel = "Value"
}
fmt.Fprintf(w, rowFmt, "Period", "Series ID", "Series Name", valueLabel)
for _, rate := range res.Rates {
fmt.Fprintf(w, rowFmt, rate.Period, rate.Series.ID, rate.Series.Name, formatFloat(rate.Value))
}
return nil
}