packages feed

orgstat-0.1.6: src/OrgStat/Logic.hs

{-# LANGUAGE ScopedTypeVariables #-}

-- | Main logic combining all components

module OrgStat.Logic
       ( runOrgStat
       ) where

import Universum

import Control.Lens (views)
import qualified Data.Text as T
import Data.Time (defaultTimeLocale, formatTime, getZonedTime)
import System.Directory (createDirectoryIfMissing)
import System.FilePath ((</>))
import Turtle (shell)

import OrgStat.CLI (CommonArgs (..))
import OrgStat.Config (ConfOutput (..), ConfOutputType (..), OrgStatConfig (..))
import OrgStat.Helpers (resolveOutput, resolveReport)
import OrgStat.Logging (logDebug, logInfo)
import OrgStat.Outputs (genBlockOutput, genSummaryOutput, processScriptOutput, processTimeline,
                        writeReport)
import OrgStat.WorkMonad (WorkM, wcCommonArgs, wcConfig)

-- | Main application logic.
runOrgStat :: WorkM ()
runOrgStat = do
    conf@OrgStatConfig{..} <- view wcConfig
    logDebug $ "Config: \n" <> show conf

    curTime <- liftIO getZonedTime
    let getOutputDir = do
            let createDir = do
                    let reportDir =
                            confOutputDir </>
                            formatTime defaultTimeLocale "%F-%H-%M-%S" curTime
                    liftIO $ createDirectoryIfMissing True reportDir
                    pure reportDir
            maybe createDir pure =<< views wcCommonArgs caOutputDir
    let writeOutput coName res = do
            reportDir <- getOutputDir
            let prePath = reportDir </> T.unpack coName
            logInfo $ "This output will be written into: " <> fromString reportDir
            writeReport prePath res

    cliOuts <- views wcCommonArgs caOutputs
    outputsToProcess <-
        bool (mapM resolveOutput cliOuts) (pure confOutputs) (null cliOuts)

    forM_ outputsToProcess $ \ConfOutput{..} -> do
        logInfo $ "Processing output " <> coName
        case coType of
            TimelineOutput {..} -> do
                resolved <- resolveReport toReport
                let timeline = processTimeline confTimelineParams resolved
                logDebug $ "Generating timeline report " <> coName <> "..."
                writeOutput coName timeline
            SummaryOutput params -> do
                summary <- genSummaryOutput params
                writeOutput coName summary
            ScriptOutput params ->
                processScriptOutput params
            BlockOutput {..} -> do
                resolved <- resolveReport boReport
                let res = genBlockOutput boParams resolved
                writeOutput coName res

    whenM (views wcCommonArgs caXdgOpen) $ do
        reportDir <- getOutputDir
        logInfo "Opening reports using xdg-open..."
        void $ shell ("for i in $(ls "<>T.pack reportDir<>"/*); do xdg-open $i; done") empty
    logInfo "Done"