groot-0.0.1.0: src/Groot/CLI/List/TaskDef.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Groot.CLI.List.TaskDef
( ListTaskDefsOpts
, listTaskDefsOpts
, printTaskDefsSummary
, TaskDefFilter(..)
) where
import Control.Lens
import Control.Monad.IO.Class
import Control.Monad.Trans.Reader
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.Data
import Data.Maybe (maybeToList)
import Data.Semigroup ((<>))
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Generics
import Network.AWS
import qualified Network.AWS.ECS as ECS
import Options.Applicative
import Text.PrettyPrint.Tabulate (Tabulate, printTable)
import qualified Text.PrettyPrint.Tabulate as Tabs
import Groot.CLI.Common
import Groot.CLI.List.Common
import Groot.Console
import Groot.Core
import Groot.Types
data ListTaskDefsOpts =
ListTaskDefsOpts Bool (Maybe TaskFamily)
deriving (Eq, Show)
listTaskDefsOpts :: Parser ListTaskDefsOpts
listTaskDefsOpts = ListTaskDefsOpts
<$> switch
( long "inactive"
<> short 'i'
<> help "Show inactive task definitions" )
<*> optional taskFamilyOpt
data TaskDefSummary = TaskDefSummary
{ family :: String
, revision :: Int
, status :: String
} deriving (Eq, Show, Generic, Data)
instance Tabulate TaskDefSummary Tabs.ExpandWhenNested
instance HasSummary ECS.TaskDefinition TaskDefSummary where
summarize taskDef = TaskDefSummary <$> tFamily <*> tRev <*> tStatus
where tFamily = T.unpack <$> taskDef ^. ECS.tdFamily
tRev = taskDef ^. ECS.tdRevision
tStatus = statusAsText <$> taskDef ^. ECS.tdStatus
where statusAsText ECS.TDSActive = "Active"
statusAsText ECS.TDSInactive = "Inactive"
summarizeTaskDefs :: [TaskDefFilter] -> AWS [TaskDefSummary]
summarizeTaskDefs filters =
runConduit $ (fetchTaskDefs filters)
=$= CL.mapMaybe summarize
=$ CL.consume
printTaskDefsSummary :: ListTaskDefsOpts -> GrootM IO ()
printTaskDefsSummary (ListTaskDefsOpts showInactive fam) =
let statusFilter = if showInactive then [TDFStatus TDSInactive] else []
familyFilter = maybeToList $ TDFFamily <$> fam
filters = statusFilter ++ familyFilter
in do
env <- ask
desc <- runResourceT . runAWS env $ summarizeTaskDefs filters
case desc of
[] -> putWarn ("No task definitions found" :: Text)
xs -> liftIO $ printTable xs