package cmd import ( "log" "os" "github.com/miguelmota/cointop/cointop" "github.com/spf13/cobra" ) // Execute executes the program func Execute() { var version, test, clean, reset, hideMarketbar, hideChart, hideStatusbar, onlyTable bool var refreshRate uint var config, cmcAPIKey, apiChoice, colorscheme, coin, currency string var rootCmd = &cobra.Command{ Use: "cointop", Short: "Cointop is an interactive terminal based app for tracking cryptocurrencies", Long: ` _ _ ___ ___ (_)_ __ | |_ ___ _ __ / __/ _ \| | '_ \| __/ _ \| '_ \ | (_| (_) | | | | | || (_) | |_) | \___\___/|_|_| |_|\__\___/| .__/ |_| Cointop is a fast and lightweight interactive terminal based UI application for tracking and monitoring cryptocurrency coin stats in real-time. For more information, visit: https://github.com/miguelmota/cointop`, RunE: func(cmd *cobra.Command, args []string) error { if version { cointop.PrintVersion() return nil } if test { // TODO: deprecate test flag, only have test command doTest() return nil } // NOTE: if reset flag enabled, reset and run cointop if reset { if err := cointop.Reset(); err != nil { return err } } // NOTE: if clean flag enabled, clean and run cointop if clean { if err := cointop.Clean(); err != nil { return err } } var refreshRateP *uint if cmd.Flags().Changed("refresh-rate") { refreshRateP = &refreshRate } ct, err := cointop.NewCointop(&cointop.Config{ ConfigFilepath: config, CoinMarketCapAPIKey: cmcAPIKey, APIChoice: apiChoice, Colorscheme: colorscheme, HideMarketbar: hideMarketbar, HideChart: hideChart, HideStatusbar: hideStatusbar, OnlyTable: onlyTable, RefreshRate: refreshRateP, }) if err != nil { return err } return ct.Run() }, } rootCmd.Flags().BoolVarP(&version, "version", "v", false, "Display current version") rootCmd.Flags().BoolVarP(&test, "test", "", false, "Run test (for Homebrew)") rootCmd.Flags().BoolVarP(&clean, "clean", "", false, "Wipe clean the cache") rootCmd.Flags().BoolVarP(&reset, "reset", "", false, "Reset the config. Make sure to backup any relevant changes first!") rootCmd.Flags().BoolVarP(&hideMarketbar, "hide-marketbar", "", false, "Hide the top marketbar") rootCmd.Flags().BoolVarP(&hideChart, "hide-chart", "", false, "Hide the chart view") rootCmd.Flags().BoolVarP(&hideStatusbar, "hide-statusbar", "", false, "Hide the bottom statusbar") rootCmd.Flags().BoolVarP(&onlyTable, "only-table", "", false, "Show only the table. Hides the chart and top and bottom bars") rootCmd.Flags().UintVarP(&refreshRate, "refresh-rate", "r", 60, "Refresh rate in seconds. Set to 0 to not auto-refresh") rootCmd.Flags().StringVarP(&config, "config", "c", "", "Config filepath. (default ~/.cointop/config.toml)") rootCmd.Flags().StringVarP(&cmcAPIKey, "coinmarketcap-api-key", "", "", "Set the CoinMarketCap API key") rootCmd.Flags().StringVarP(&apiChoice, "api", "", cointop.CoinGecko, "API choice. Available choices are \"coinmarketcap\" and \"coingecko\"") rootCmd.Flags().StringVarP(&colorscheme, "colorscheme", "", "", "Colorscheme to use (default \"cointop\"). To install standard themes, do:\n\ngit clone git@github.com:cointop-sh/colors.git ~/.cointop/colors\n\nFor additional instructions, visit: https://github.com/cointop-sh/colors") var versionCmd = &cobra.Command{ Use: "version", Short: "Displays the current version", Long: `The version command displays the current version`, Run: func(cmd *cobra.Command, args []string) { cointop.PrintVersion() }, } var cleanCmd = &cobra.Command{ Use: "clean", Short: "Clear the cache", Long: `The clean command clears the cache`, RunE: func(cmd *cobra.Command, args []string) error { // NOTE: if clean command, clean but don't run cointop return cointop.Clean() }, } var resetCmd = &cobra.Command{ Use: "reset", Short: "Resets the config and clear the cache", Long: `The reset command resets the config and clears the cache`, RunE: func(cmd *cobra.Command, args []string) error { // NOTE: if reset command, reset but don't run cointop return cointop.Reset() }, } var priceCmd = &cobra.Command{ Use: "price", Short: "Displays the current price of a coin", Long: `The price command display the current price of a coin`, RunE: func(cmd *cobra.Command, args []string) error { return cointop.PrintPrice(&cointop.PriceConfig{ Coin: coin, Currency: currency, APIChoice: apiChoice, }) }, } var testCmd = &cobra.Command{ Use: "test", Short: "Runs tests", Long: `The test command runs tests for Homebrew`, Run: func(cmd *cobra.Command, args []string) { doTest() }, } priceCmd.Flags().StringVarP(&coin, "coin", "c", "bitcoin", "Full name of the coin (default \"bitcoin\")") priceCmd.Flags().StringVarP(¤cy, "currency", "f", "USD", "The currency to convert to (default \"USD\")") priceCmd.Flags().StringVarP(&apiChoice, "api", "a", cointop.CoinGecko, "API choice. Available choices are \"coinmarketcap\" and \"coingecko\"") rootCmd.AddCommand(versionCmd, cleanCmd, resetCmd, priceCmd, testCmd) if err := rootCmd.Execute(); err != nil { log.Fatal(err) os.Exit(1) } } func doTest() { ct, err := cointop.NewCointop(&cointop.Config{ NoPrompts: true, }) if err != nil { log.Fatal(err) } ct.Exit() }