{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} module Main where -------------------------------------------------------------------------------- import Control.Monad import Control.Monad.IO.Class import Control.Monad.Trans.Either import Data.List import Data.Monoid import Data.Text (Text) import qualified Data.Text as T import Servant.API import System.Environment import System.Exit import Text.Read (readMaybe) -------------------------------------------------------------------------------- import Web.Tracker -------------------------------------------------------------------------------- main :: IO () main = do token <- fmap T.pack <$> lookupEnv "TRACKER_API_TOKEN" query <- getArgs >>= return . \case "unstart" :sid:[] -> doSetState token Unstarted <$> readMaybe sid "start" :sid:[] -> doSetState token Started <$> readMaybe sid "finish" :sid:[] -> doSetState token Finished <$> readMaybe sid "deliver" :sid:[] -> doSetState token Delivered <$> readMaybe sid "accept" :sid:[] -> doSetState token Accepted <$> readMaybe sid "reject" :sid:[] -> doSetState token Rejected <$> readMaybe sid "stateOf" :sid:[] -> doStateOf token <$> readMaybe sid "list-unstarted" :pid:[] -> doList token Unstarted <$> readMaybe pid "list-started" :pid:[] -> doList token Started <$> readMaybe pid "list-finished" :pid:[] -> doList token Finished <$> readMaybe pid "list-delivered" :pid:[] -> doList token Delivered <$> readMaybe pid _ -> Nothing query <- maybe invalidSyntax return query runEitherT query >>= \case Left err -> print err >> exitWith (ExitFailure 1) Right () -> return () return () doSetState :: Maybe Text -> StoryState -> StoryId -> EitherT ServantError IO () doSetState t s i = void $ updateStory t (SetStoryState s) i printStory :: MonadIO m => Story -> m () printStory Story{sId=StoryId id, sName, sStoryType, sCurrentState} = liftIO . putStrLn $ show id <> "\t" <> show sStoryType <> "\t" <> show sCurrentState <> "\t" <> T.unpack sName doList :: Maybe Text -> StoryState -> ProjectId -> EitherT ServantError IO () doList t s i = stories t i (Just s) >>= mapM_ printStory . take 30 doStateOf :: Maybe Text -> StoryId -> EitherT ServantError IO () doStateOf t i = story t i >>= liftIO . print . sCurrentState invalidSyntax :: IO a invalidSyntax = getProgName >>= putStrLn . msg >> exitWith (ExitFailure 1) where msg n = "Usage: " <> n <> " STORY_ID\n" <> " Use TRACKER_API_TOKEN environment variable if needed"