orgstat-0.1.9: src/OrgStat/Outputs/Script.hs
-- | Script output type. We launch the executable asked after
-- injecting the environment variables related to the report.
module OrgStat.Outputs.Script
( processScriptOutput
) where
import Universum
import Control.Lens (views)
import qualified Data.Map.Strict as M
import System.Environment (lookupEnv, setEnv, unsetEnv)
import System.Process (callCommand)
import OrgStat.Ast
import OrgStat.Config (confReports, crName)
import OrgStat.Helpers (resolveReport)
import OrgStat.Outputs.Types (ScriptParams(..))
import OrgStat.Util (timeF)
import OrgStat.WorkMonad (WorkM, wcConfig)
-- | Processes script output.
processScriptOutput :: ScriptParams -> WorkM ()
processScriptOutput ScriptParams{..} = do
-- Considering all the reports if none are specified.
reportsToConsider <- case spReports of
[] -> views wcConfig (map crName . confReports)
xs -> pure xs
allReports <- mapM (\r -> (r,) <$> resolveReport r) reportsToConsider
-- Set env variables
prevVars <- forM allReports $ \(toString -> reportName,org) -> do
let duration = timeF $ orgTotalDuration $ filterHasClock org
let mean = timeF $ orgMeanDuration $ filterHasClock org
let median = timeF $ orgMedianDuration $ filterHasClock org
let pomodoro = orgPomodoroNum $ filterHasClock org
let toMinutes x = round x `div` 60
-- logWarning $ "1: " <> show org
-- logWarning $ "2: " <> show (filterHasClock org)
-- logWarning $ "3: " <> show (orgDurations $ filterHasClock org)
let durationsPyth :: [Int] = map toMinutes $ orgDurations $ filterHasClock org
(prevVar :: Maybe String) <- liftIO $ lookupEnv reportName
liftIO $ setEnv reportName (toString duration)
liftIO $ setEnv (reportName <> "Mean") (toString mean)
liftIO $ setEnv (reportName <> "Median") (toString median)
liftIO $ setEnv (reportName <> "Pomodoro") (show pomodoro)
liftIO $ setEnv (reportName <> "DurationsList") (show durationsPyth)
pure $ (reportName,) <$> prevVar
let prevVarsMap :: Map String String
prevVarsMap = M.fromList $ catMaybes prevVars
-- Execute script
let cmdArgument = either id (\t -> "-c \"" <> toString t <> "\"") spScript
liftIO $ callCommand $
spInterpreter <> " " <> cmdArgument
--"/bin/env sh " <> cmdArgument
-- Restore the old variables, clean new.
forM_ (map fst allReports) $ \(toString -> reportName) -> do
liftIO $ case M.lookup reportName prevVarsMap of
Nothing -> unsetEnv reportName
Just prevValue -> setEnv reportName prevValue
where