{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
module Main where
import Network.HTTP.Client
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Data.Aeson (FromJSON(..), decode)
import GHC.Generics (Generic(..))
import System.Environment (getArgs)
main :: IO ()
main = do
args <- getArgs
let (icon, mode) = (getIcon args, getMode args)
mResponse <- makeBtcReq mode
putStrLn $ maybe "" (formatValue icon mode) mResponse
getIcon :: [String] -> String
getIcon = \case
_ : icon : _ -> icon
_ -> ""
getMode :: [String] -> Mode
getMode = read . head
makeBtcReq :: Mode -> IO (Maybe GdaxResponse)
makeBtcReq mode = do
manager <- newManager tlsManagerSettings
request <- createRequest
response <- httpLbs request manager
pure . decode $ responseBody response
where
urlForMode
= "https://api.gdax.com/products/BTC-"<> show mode <>"/ticker"
createRequest
= addUserAgent <$> parseRequest urlForMode
addUserAgent req'
= req' { requestHeaders = ("User-Agent", "Ticker") : requestHeaders req' }
formatValue :: String -> Mode -> GdaxResponse -> String
formatValue icon mode (GdaxResponse amount)
= icon <> formatWithCurrency amount mode
formatWithCurrency :: String -> Mode -> String
formatWithCurrency amount = \case
EUR -> amount <> " €"
USD -> "$ " <> amount
GBP -> "£ " <> amount
data GdaxResponse = GdaxResponse { ask :: String } deriving (Generic, FromJSON)
data Mode = EUR | GBP | USD deriving (Eq, Show, Read)