From 180edacd42c3a28ba9f71b8b37e05aaf62c47438 Mon Sep 17 00:00:00 2001 From: Miguel Mota Date: Fri, 30 Mar 2018 11:34:45 -0700 Subject: [PATCH] abstract api --- apis/cmc/cmc.go | 71 +++++++++++++++++++++++++++++ apis/interface.go | 17 +++++++ apis/types/types.go | 54 ++++++++++++++++++++++ cointop.go | 95 ++++++++++++++++++++------------------- services/api/interface.go | 0 5 files changed, 192 insertions(+), 45 deletions(-) create mode 100644 apis/cmc/cmc.go create mode 100644 apis/interface.go create mode 100644 apis/types/types.go delete mode 100644 services/api/interface.go diff --git a/apis/cmc/cmc.go b/apis/cmc/cmc.go new file mode 100644 index 0000000..aef7bf6 --- /dev/null +++ b/apis/cmc/cmc.go @@ -0,0 +1,71 @@ +package apis + +import ( + types "github.com/miguelmota/cointop/apis/types" + cmc "github.com/miguelmota/go-coinmarketcap" +) + +// Service service +type Service struct { +} + +// New new service +func New() *Service { + return &Service{} +} + +// GetAllCoinData gets all coin data +func (s *Service) GetAllCoinData(limit int) (map[string]types.Coin, error) { + ret := make(map[string]types.Coin) + coins, err := cmc.GetAllCoinData(int(limit)) + if err != nil { + return ret, err + } + for _, v := range coins { + ret[v.ID] = types.Coin{ + ID: v.ID, + Name: v.Name, + Symbol: v.Symbol, + Rank: v.Rank, + PriceUSD: v.PriceUSD, + PriceBTC: v.PriceBTC, + USD24HVolume: v.USD24HVolume, + MarketCapUSD: v.MarketCapUSD, + AvailableSupply: v.AvailableSupply, + TotalSupply: v.TotalSupply, + PercentChange1H: v.PercentChange1H, + PercentChange24H: v.PercentChange24H, + PercentChange7D: v.PercentChange7D, + LastUpdated: v.LastUpdated, + } + } + return ret, nil +} + +// GetCoinGraphData gets coin graph data +func (s *Service) GetCoinGraphData(coin string, start int64, end int64) (types.CoinGraph, error) { + ret := types.CoinGraph{} + graphData, err := cmc.GetCoinGraphData(coin, start, end) + if err != nil { + return ret, err + } + + ret.MarketCapByAvailableSupply = graphData.MarketCapByAvailableSupply + ret.PriceBTC = graphData.PriceBTC + ret.PriceUSD = graphData.PriceUSD + ret.VolumeUSD = graphData.VolumeUSD + return ret, nil +} + +// GetGlobalMarketGraphData gets global market graph data +func (s *Service) GetGlobalMarketGraphData(start int64, end int64) (types.MarketGraph, error) { + ret := types.MarketGraph{} + graphData, err := cmc.GetGlobalMarketGraphData(start, end) + if err != nil { + return ret, err + } + + ret.MarketCapByAvailableSupply = graphData.MarketCapByAvailableSupply + ret.VolumeUSD = graphData.VolumeUSD + return ret, nil +} diff --git a/apis/interface.go b/apis/interface.go new file mode 100644 index 0000000..9c0cfbb --- /dev/null +++ b/apis/interface.go @@ -0,0 +1,17 @@ +package apis + +import ( + types "github.com/miguelmota/cointop/apis/types" +) + +// Interface interface +type Interface interface { + GetAllCoinData(limit int) (map[string]types.Coin, error) + GetCoinGraphData(coin string, start int64, end int64) (types.CoinGraph, error) + GetGlobalMarketGraphData(start int64, end int64) (types.MarketGraph, error) + //GetCoinData(coin string) (types.Coin, error) + //GetGlobalMarketData() (types.GlobalMarketData, error) + //GetAltcoinMarketGraphData(start int64, end int64) (types.MarketGraph, error) + //GetCoinPriceUSD(coin string) (float64, error) + //GetCoinMarkets(coin string) ([]types.Market, error) +} diff --git a/apis/types/types.go b/apis/types/types.go new file mode 100644 index 0000000..082e95b --- /dev/null +++ b/apis/types/types.go @@ -0,0 +1,54 @@ +package apis + +// Coin struct +type Coin struct { + ID string + Name string + Symbol string + Rank int + PriceUSD float64 + PriceBTC float64 + USD24HVolume float64 + MarketCapUSD float64 + AvailableSupply float64 + TotalSupply float64 + PercentChange1H float64 + PercentChange24H float64 + PercentChange7D float64 + LastUpdated string +} + +// GlobalMarketData struct +type GlobalMarketData struct { + TotalMarketCapUSD float64 + Total24HVolumeUSD float64 + BitcoinPercentageOfMarketCap float64 + ActiveCurrencies int + ActiveAssets int + ActiveMarkets int +} + +// CoinGraph struct +type CoinGraph struct { + MarketCapByAvailableSupply [][]float64 + PriceBTC [][]float64 + PriceUSD [][]float64 + VolumeUSD [][]float64 +} + +// Market struct +type Market struct { + Rank int + Exchange string + Pair string + VolumeUSD float64 + Price float64 + VolumePercent float64 + Updated string +} + +// MarketGraph struct +type MarketGraph struct { + MarketCapByAvailableSupply [][]float64 + VolumeUSD [][]float64 +} diff --git a/cointop.go b/cointop.go index f778981..676b395 100644 --- a/cointop.go +++ b/cointop.go @@ -11,8 +11,10 @@ import ( "github.com/fatih/color" "github.com/gizak/termui" "github.com/jroimartin/gocui" + "github.com/miguelmota/cointop/apis" + cmc "github.com/miguelmota/cointop/apis/cmc" + apitypes "github.com/miguelmota/cointop/apis/types" "github.com/miguelmota/cointop/table" - cmc "github.com/miguelmota/go-coinmarketcap" "github.com/willf/pad" ) @@ -42,7 +44,33 @@ type Cointop struct { table *table.Table sortdesc bool currentsort string - coins []*cmc.Coin + api apis.Interface + coins []*apitypes.Coin +} + +func main() { + g, err := gocui.NewGui(gocui.Output256) + if err != nil { + log.Fatalf("new gocui: %v", err) + } + defer g.Close() + g.Cursor = true + g.Mouse = true + g.Highlight = true + + ct := Cointop{ + g: g, + api: cmc.New(), + } + g.SetManagerFunc(ct.layout) + + if err := ct.keybindings(g); err != nil { + log.Fatalf("keybindings: %v", err) + } + + if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { + log.Fatalf("main loop: %v", err) + } } func (ct *Cointop) chartPoints(maxX int, coin string) error { @@ -59,7 +87,7 @@ func (ct *Cointop) chartPoints(maxX int, coin string) error { _ = coin //graphData, err := cmc.GetCoinGraphData(coin, start, end) - graphData, err := cmc.GetGlobalMarketGraphData(start, end) + graphData, err := ct.api.GetGlobalMarketGraphData(start, end) if err != nil { log.Fatal(err) return nil @@ -103,30 +131,6 @@ func (ct *Cointop) chartPoints(maxX int, coin string) error { return nil } -func main() { - g, err := gocui.NewGui(gocui.Output256) - if err != nil { - log.Fatalf("new gocui: %v", err) - } - defer g.Close() - g.Cursor = true - g.Mouse = true - g.Highlight = true - - ct := Cointop{ - g: g, - } - g.SetManagerFunc(ct.layout) - - if err := ct.keybindings(g); err != nil { - log.Fatalf("keybindings: %v", err) - } - - if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { - log.Fatalf("main loop: %v", err) - } -} - func (ct *Cointop) quit(g *gocui.Gui, v *gocui.View) error { return gocui.ErrQuit } @@ -325,23 +329,23 @@ func (ct *Cointop) pageUp(g *gocui.Gui, v *gocui.View) error { if ct.tableview == nil { return nil } - ox, oy := v.Origin() - cx, cy := v.Cursor() - _, sy := v.Size() + ox, oy := ct.tableview.Origin() + cx, cy := ct.tableview.Cursor() + _, sy := ct.tableview.Size() rows := sy //fmt.Fprint(v, oy) - if err := v.SetCursor(cx, cy-rows); err != nil && oy > 0 { - if err := v.SetOrigin(ox, oy-rows); err != nil { + if err := ct.tableview.SetCursor(cx, cy-rows); err != nil && oy > 0 { + if err := ct.tableview.SetOrigin(ox, oy-rows); err != nil { return err } } return nil } -func fetchData() ([]*cmc.Coin, error) { +func (ct *Cointop) fetchData() ([]*apitypes.Coin, error) { limit := 100 - result := []*cmc.Coin{} - coins, err := cmc.GetAllCoinData(int(limit)) + result := []*apitypes.Coin{} + coins, err := ct.api.GetAllCoinData(int(limit)) if err != nil { return result, err } @@ -362,8 +366,8 @@ func (ct *Cointop) layout(g *gocui.Gui) error { if err != gocui.ErrUnknownView { return err } - v.Frame = false ct.chartview = v + ct.chartview.Frame = false ct.setChart() } @@ -392,21 +396,22 @@ func (ct *Cointop) layout(g *gocui.Gui) error { } t.Format().Fprint(v) - v.Highlight = true - v.SelBgColor = gocui.ColorGreen - v.SelFgColor = gocui.ColorBlack - v.Frame = false + ct.headersview = v + ct.headersview.Highlight = true + ct.headersview.SelBgColor = gocui.ColorGreen + ct.headersview.SelFgColor = gocui.ColorBlack + ct.headersview.Frame = false } if v, err := g.SetView("table", 0, chartHeight+1, maxX, maxY); err != nil { if err != gocui.ErrUnknownView { return err } - v.Highlight = true - v.SelBgColor = gocui.ColorCyan - v.SelFgColor = gocui.ColorBlack - v.Frame = false ct.tableview = v + ct.tableview.Highlight = true + ct.tableview.SelBgColor = gocui.ColorCyan + ct.tableview.SelFgColor = gocui.ColorBlack + ct.tableview.Frame = false ct.setTable() } @@ -448,7 +453,7 @@ func (ct *Cointop) setTable() error { ct.table.HideColumHeaders = true var err error if len(ct.coins) == 0 { - ct.coins, err = fetchData() + ct.coins, err = ct.fetchData() if err != nil { return err } diff --git a/services/api/interface.go b/services/api/interface.go deleted file mode 100644 index e69de29..0000000