{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-} ----------------------------------------------------------------------------- -- | -- Module : TaskMonad.Utils -- Copyright : Max Magorsch -- License : BSD-style (see LICENSE) -- -- Maintainer : Max Magorsch -- Stability : unstable -- Portability : unportable -- -- TaskMonad.Utils bundles a number of help functions that can be used to -- interact with the taskwarrior command line application. -- ----------------------------------------------------------------------------- module TaskMonad.Utils ( getTaskwarriorTaskList , getTaskwarriorIds , isTWReport , defaulttwreports , execCommand , execCommandWithOutput , twicon ) where import Data.List import Data.Maybe import System.Process import System.IO import Control.Monad ( filterM ) import XMonad hiding ( liftX ) import XMonad.Util.Font import qualified XMonad.StackSet as W import XMonad.Layout.Decoration import XMonad.Prompt import XMonad.Prompt.Input import XMonad.Util.Image import XMonad.Util.NamedWindows import XMonad.Util.XUtils import XMonad.Util.NamedScratchpad import XMonad.Util.Run import XMonad.Actions.GridSelect -- | Returns a filtered list of all properties that belong to a given category. For example -- -- > getTaskwarriorIds "status:pending" "tags" -- -- returns a list of all tags of the pending tasks. Likewise -- -- > getTaskwarriorIds "status:pending" "ids" -- -- returns the ids of all pending tasks. getTaskwarriorIds :: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information. -> String -- ^ The category of properties that should be returned, e.g. "ids" or "tags" -> IO [String] -- ^ A filtered list of all properties that belong to the specified category getTaskwarriorIds filter category = do result <- execCommandWithOutput "task" (filter ++ " _" ++ category) return $ lines result -- | Get a tuple containing the id and the description of a task with a specified id getTaskwarriorTaskDescription :: String -- ^ the id of the task -> IO (String, String) -- ^ (the id of the task, the description) getTaskwarriorTaskDescription id = do result <- execCommandWithOutput "task" ("_get " ++ id ++ ".description") return (id, result) -- | Get the description of a task with a specified id getTaskDescription :: String -- ^ the id of the task -> IO String -- ^ the description of the task getTaskDescription id = execCommandWithOutput "task" ("_get " ++ id ++ ".description") -- | Returns a filtered list of tasks that contains the specified properties of each task getTaskwarriorTaskList :: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information. -> [String] -- ^ A list of properties that should be retrieved for each task, e.g. ["id", "description", "tags"] -> IO [[String]] -- ^ A filtered list of tasks that contains the specified properties of each task getTaskwarriorTaskList filter taskproperties = do ids <- getTaskwarriorIds filter "ids" traverse (getTaskwarriorTaskProperties taskproperties) ids -- | Get a list of specified properties of a task with a specified id getTaskwarriorTaskProperties :: Traversable t => t String -- ^ a list of properties -> String -- ^ the id of the task -> IO (t String) -- ^ the list containing the values of the specified properties getTaskwarriorTaskProperties properties id = traverse (getTaskwarriorTaskProperty id) properties -- | Get a specified property of a task with a specified id getTaskwarriorTaskProperty :: String -- ^ the id of the task -> String -- ^ the desired property -> IO String -- ^ the value of the desired property of the specified task getTaskwarriorTaskProperty id property = do result <- execCommandWithOutput "task" ("_get " ++ id ++ "." ++ property) return $ filter (/= '\n') result -- | Checks whether a given taskwarrior command is a report or not isTWReport :: String -> Bool isTWReport command = head (words command) `elem` defaulttwreports -- | A list containing all taskwarrior reports. For further information, please refer to [https://taskwarrior.org/docs/report.html](https://taskwarrior.org/docs/report.html) defaulttwreports :: [String] defaulttwreports = [ "dailyreview" , "weeklyreview" , "inbox" , "processInbox" , "process" , "active" , "all" , "blocked" , "blocking" , "completed" , "done" , "list" , "long" , "ls" , "minimal" , "newest" , "next" , "oldest" , "overdue" , "ready" , "recurring" , "unblocked" , "waiting" , "burndown.daily" , "burndown.monthly" , "burndown.weekly" , "calendar" , "colors" , "columns" , "commands" , "diagnostics" , "ghistory.annual" , "ghistory.monthly" , "ghistory.weekly" , "ghistory.daily" , "history.annual" , "history.monthly" , "history.weekly" , "history.daily" , "ids" , "information" , "projects" , "reports" , "show" , "stats" , "summary" , "tags" , "timesheet" , "udas" , "uuids" ] -- | Executes a shell command. execCommand :: MonadIO m => String -> m () execCommand = unsafeSpawn -- | Executes an executable with args and returns the output. execCommandWithOutput :: FilePath -> String -> IO String execCommandWithOutput executable args = do (_, Just hout, _, _) <- createProcess (proc executable (words args)) { std_out = CreatePipe } hGetContents hout -- | The Taskwarrior icon twicon :: [[Bool]] twicon = [ [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , False , False , False , False , True , True , True , True , True , True , False , False , False , False , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , False , False , False , False , False , False , False , False , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , False , False , False , False , False , False , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , True , True , False , False , False , False , True , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , True , False , False , False , False , True , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , True , True , False , False , False , False , True , True , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , True , False , False , False , False , True , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] , [ False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False , False ] ]