PS / src / configs / pairs.go
pairs.go
Raw
package configs

import (
	"encoding/json"
	"errors"
	log "github.com/sirupsen/logrus"
	"io/ioutil"
	"net/http"
	"os"
	"portfolio/schema"
	"sync"
)

var (
	onceForChainPairs sync.Once
	allPairs          = make(schema.PairMapping)
	chainPairs        = make(map[schema.ChainId]schema.PairMapping)
	allPairsArray     = make([]schema.Pair, 0)
	pairsUrl          = "https://raw.githubusercontent.com/PiperFinance/CD/main/pair/all_pairs.json"
	pairsDir          = "data/all_pairs.json"
)

func init() {

	onceForChainPairs.Do(func() {
		// Load Pairs ...
		var byteValue []byte
		if _, err := os.Stat(pairsDir); errors.Is(err, os.ErrNotExist) {
			resp, err := http.Get(pairsUrl)
			if err != nil {
				log.Fatalln(err)
			}
			byteValue, err = ioutil.ReadAll(resp.Body)
			if err != nil {
				log.Fatalf("HTTPPairLoader: %s", err)
			}
		} else {
			jsonFile, err := os.Open(pairsDir)
			defer func(jsonFile *os.File) {
				err := jsonFile.Close()
				if err != nil {
					log.Error(err)
				}
			}(jsonFile)
			if err != nil {
				log.Fatalf("JSONPairLoader: %s", err)
			}
			byteValue, err = ioutil.ReadAll(jsonFile)
			if err != nil {
				log.Fatalf("JSONPairLoader: %s", err)
			}
		}
		err := json.Unmarshal(byteValue, &allPairs)
		if err != nil {
			log.Fatalf("PairLoader: %s", err)
		}

		for pairId, pair := range allPairs {
			chainId := pair.Detail.ChainId
			if chainPairs[chainId] == nil {
				chainPairs[chainId] = make(schema.PairMapping)
			}
			chainPairs[chainId][pairId] = pair
			allPairsArray = append(allPairsArray, pair)
		}

	})

}

func AllChainsPairs() schema.PairMapping {
	return allPairs
}

func AllChainsPairsArray() schema.PairMapping {
	return allPairs
}

func ChainPairs(id schema.ChainId) schema.PairMapping {
	return chainPairs[id]
}
func ChainPairsArray(id schema.ChainId) schema.PairMapping {
	return chainPairs[id]
}