-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rate.go
79 lines (66 loc) · 1.88 KB
/
rate.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
package clearbank
import (
"context"
"fmt"
"net/http"
"strconv"
)
type RateClient interface {
FetchMarketrate(context.Context, MarketrateParams) (MarketrateResponse, error)
Negotiate(context.Context) (NegotiateResponse, error)
}
type FixedSide string
const (
FixedSideBuy FixedSide = "BUY"
FixedSideSell FixedSide = "SELL"
)
type MarketrateParams struct {
SellCurrency string
BuyCurrency string
InstructedAmount float64
FixedSide FixedSide
ValueDate string
}
type MarketrateResponse struct {
Symbol string `json:"symbol"`
MarketRate float64 `json:"marketRate"`
ValueDate Time `json:"valueDate"`
}
func MarketrateNotAvailableError(err error) bool {
switch e := err.(type) {
case UnexpectedResponse:
switch e.Status {
case http.StatusNotFound, http.StatusBadRequest:
return true
}
}
return false
}
func (c *client) FetchMarketrate(ctx context.Context, params MarketrateParams) (data MarketrateResponse, err error) {
req, err := c.newRequest(ctx, http.MethodGet, "/fx/v1/marketrate", nil)
if err != nil {
return data, fmt.Errorf("failed to create request: %w", err)
}
req.AddQueryParams(map[string]string{
"SellCurrency": params.SellCurrency,
"BuyCurrency": params.BuyCurrency,
"InstructedAmount": strconv.FormatFloat(params.InstructedAmount, 'f', 2, 64),
"FixedSide": string(params.FixedSide),
"ValueDate": params.ValueDate,
})
req.ExpectStatus(http.StatusOK)
req.DecodeTo(&data)
return data, c.do(ctx, req)
}
type NegotiateResponse struct {
URL string `json:"url"`
}
func (c *client) Negotiate(ctx context.Context) (data NegotiateResponse, err error) {
req, err := c.newRequest(ctx, http.MethodGet, "/fx/v1/marketdatastream/negotiate", nil)
if err != nil {
return data, fmt.Errorf("failed to create request: %w", err)
}
req.ExpectStatus(http.StatusOK)
req.DecodeTo(&data)
return data, c.do(ctx, req)
}