packages feed

orgstat-0.1.3: 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 System.Wlog (logDebug, logInfo)
import Turtle (shell)

import OrgStat.CLI (CommonArgs (..))
import OrgStat.Config (ConfOutput (..), ConfOutputType (..), OrgStatConfig (..))
import OrgStat.Helpers (resolveOutput, resolveReport)
import OrgStat.Outputs (genBlockOutput, genSummaryOutput, processTimeline, tpColorSalt, 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 createDir = do
            let reportDir = confOutputDir </>
                            formatTime defaultTimeLocale "%F-%H-%M-%S" curTime
            liftIO $ createDirectoryIfMissing True reportDir
            pure reportDir
    reportDir <- maybe createDir pure =<< views wcCommonArgs outputDir
    logInfo $ "This report set will be put into: " <> fromString reportDir

    outputsToProcess <-
        maybe (pure confOutputs) (fmap one . resolveOutput) =<<
        views wcCommonArgs selectOutput
    forM_ outputsToProcess $ \ConfOutput{..} -> do
        logInfo $ "Processing output " <> coName
        let prePath = reportDir </> T.unpack coName
        case coType of
            TimelineOutput {..} -> do
                resolved <- resolveReport toReport
                let timelineParamsFinal =
                        (confBaseTimelineParams <> toParams) & tpColorSalt .~ confColorSalt
                let res = processTimeline timelineParamsFinal resolved
                logInfo $ "Generating timeline report " <> coName <> "..."
                writeReport prePath res
            SummaryOutput params -> do
                summary <- genSummaryOutput params
                writeReport prePath summary
            BlockOutput {..} -> do
                resolved <- resolveReport boReport
                let res = genBlockOutput boParams resolved
                writeReport prePath res
    whenM (views wcCommonArgs xdgOpen) $ do
        logInfo "Opening reports using xdg-open..."
        void $ shell ("for i in $(ls "<>T.pack reportDir<>"/*); do xdg-open $i; done") empty
    logInfo "Done"