package main import ( "os" ) type PriceRecord struct { MTGO map[string]PriceList `json:"mtgo,omitempty"` Paper map[string]PriceList `json:"paper,omitempty"` } type PricePoints struct { Normal map[string]float64 `json:"normal,omitempty"` Foil map[string]float64 `json:"foil,omitempty"` } type PriceList struct { Retail *PricePoints `json:"retail,omitempty"` Currency string `json:"currency"` Buylist *PricePoints `json:"buylist,omitempty"` } type PriceDB struct { Data map[string]PriceRecord `json:"data"` } type CardPriceEntry struct { UUID string `json:"uuid"` Price float64 `json:"price"` Currency string `json:"currency"` Seller string `json:"seller"` } func loadPrices(pricesFile string, priceFilter float64) func() ([]CardPriceEntry, error) { return func() ([]CardPriceEntry, error) { // Check if prices file exists _, err := os.Stat(pricesFile) if os.IsNotExist(err) { // Download prices file err = downloadFile(pricesURL, pricesFile) } if err != nil { return nil, err } // Read prices file var priceDB PriceDB err = readJSONFile(pricesFile, &priceDB) if err != nil { return nil, err } // Filter cards we care about entries := make([]CardPriceEntry, 0) for uuid, priceCatalog := range priceDB.Data { // Get all paper retail prices lowestPrice, currency, seller := getLowestPrice(priceCatalog.Paper) if priceFilter < lowestPrice { continue } entries = append(entries, CardPriceEntry{ UUID: uuid, Price: lowestPrice, Currency: currency, Seller: seller, }) } return entries, nil } } func getLowestPrice(sellers map[string]PriceList) (lowestPrice float64, currency string, seller string) { lowestPrice = 9999 for cardSeller, priceList := range sellers { if priceList.Retail == nil { continue } for _, price := range priceList.Retail.Normal { if price < lowestPrice { lowestPrice = price currency = priceList.Currency seller = cardSeller } } for _, price := range priceList.Retail.Foil { if price < lowestPrice { lowestPrice = price currency = priceList.Currency seller = cardSeller } } } return }