-- | 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