65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
|
package mercuryo
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
currenciesURL = "https://api.mercuryo.io/v1.6/lib/currencies" // nolint: gosec
|
||
|
)
|
||
|
|
||
|
type Token struct {
|
||
|
Symbol string `json:"symbol"`
|
||
|
Address string `json:"address"`
|
||
|
Decimals uint `json:"decimals"`
|
||
|
Img string `json:"img"`
|
||
|
Network int `json:"network"`
|
||
|
}
|
||
|
|
||
|
type CurrenciesResponse struct {
|
||
|
Data CurrenciesData `json:"data"`
|
||
|
Status int `json:"status"`
|
||
|
}
|
||
|
|
||
|
type CurrenciesData struct {
|
||
|
Config Config `json:"config"`
|
||
|
}
|
||
|
|
||
|
type Config struct {
|
||
|
CryptoCurrencies []CryptoCurrency `json:"crypto_currencies"`
|
||
|
}
|
||
|
|
||
|
type CryptoCurrency struct {
|
||
|
Symbol string `json:"currency"`
|
||
|
Network string `json:"network"`
|
||
|
Contract string `json:"contract"`
|
||
|
}
|
||
|
|
||
|
func (c *Client) FetchCurrencies(ctx context.Context) ([]CryptoCurrency, error) {
|
||
|
response, err := c.httpClient.DoGetRequest(ctx, currenciesURL, nil, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return handleCurrenciesResponse(response)
|
||
|
}
|
||
|
|
||
|
func handleCurrenciesResponse(response []byte) ([]CryptoCurrency, error) {
|
||
|
var currenciesResponse CurrenciesResponse
|
||
|
err := json.Unmarshal(response, ¤ciesResponse)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if currenciesResponse.Status != http.StatusOK {
|
||
|
return nil, fmt.Errorf("unsuccessful request: %d %s", currenciesResponse.Status, http.StatusText(currenciesResponse.Status))
|
||
|
}
|
||
|
|
||
|
assets := currenciesResponse.Data.Config.CryptoCurrencies
|
||
|
|
||
|
return assets, nil
|
||
|
}
|