You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.0 KiB

package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"strconv"
"strings"
)
type Currency struct {
Id int `json:"id"`
Name string `json:"name"`
Symbol string `json:"symbol"`
Quote struct {
USD struct {
Price float64 `json:"price"`
}
}
}
type Content struct {
Data []Currency
}
type Result struct {
Symbol string
Balance float64
USD float64
}
func main() {
var configPath string
flag.StringVar(&configPath, "config", "config.yaml", "Path to config.toml")
flag.Parse()
if err := MustRead(configPath); err != nil {
fmt.Println(err)
os.Exit(1)
}
currencies := getCurrencies()
results, total := calculateResults(currencies, C.Currencies)
printResults(results, total)
}
func printResults(results []Result, total float64) {
fmt.Println("Curr Balance USD")
for _, r := range results {
fmt.Println(r.Symbol + " " +
strconv.FormatFloat(r.Balance, 'f', 6, 64) + " " +
strconv.FormatFloat(r.USD, 'f', 6, 64))
}
fmt.Println("\ntotal USD:", total)
}
func calculateResults(currencies []Currency, configCurrencies map[string]float64) ([]Result, float64) {
var results []Result
var total float64
total = 0
for _, c := range currencies {
if configCurrencies[strings.ToLower(c.Symbol)] != 0 {
balance := configCurrencies[strings.ToLower(c.Symbol)]
price := c.Quote.USD.Price
result := Result{
Symbol: c.Symbol,
Balance: balance,
USD: balance * price,
}
results = append(results, result)
total = total + result.USD
}
}
return results, total
}
func getCurrencies() []Currency {
url := "https://web-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?limit=35&start=1"
response, err := http.Get(url)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var content Content
err = json.Unmarshal(contents, &content)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return content.Data
}