import Control.Monad (liftM2) import Data.List (sortBy) import Data.Time.Calendar import Data.Time.Clock import Data.Time.Clock.POSIX (posixDayLength) import Data.Time.Format import qualified Data.Map as Map import Data.Maybe import Data.Yaml import System.Locale (defaultTimeLocale) import System.Environment (getArgs) fieldFilter :: String -> String -> Map.Map String String -> Bool fieldFilter field val ymap = Map.lookup field ymap == Just val statusFilter :: String -> Map.Map String String -> Bool statusFilter = fieldFilter "Status" assigneeFilter :: String -> Map.Map String String -> Bool assigneeFilter = fieldFilter "AssignedTo" formatDeadline :: Map.Map String String -> String formatDeadline ymap = user ++ "|" ++ date ++ "|" ++ filename where user = fromMaybe "ERROR" (Map.lookup "AssignedTo" ymap) date = fromMaybe "ERROR" (Map.lookup "Date" ymap) filename = fromMaybe "ERROR" (Map.lookup "filename" ymap) dateParse :: String -> UTCTime dateParse x = fromMaybe (UTCTime (fromGregorian 0 1 1) (secondsToDiffTime 0)) $ parseTime defaultTimeLocale "%Y-%m-%d" x dateConv :: Map.Map String String -> UTCTime dateConv ymap = dateParse (fromMaybe "1900-01-01" (Map.lookup "Date" ymap)) dateSorter :: Map.Map String String -> Map.Map String String -> Ordering dateSorter amap bmap = compare (dateConv amap) (dateConv bmap) dateFilter :: (UTCTime -> Bool) -> Map.Map String String -> Bool dateFilter func ymap = func (dateConv ymap) printIfNonEmpty :: String -> [Map.Map String String] -> IO () printIfNonEmpty _ [] = return () printIfNonEmpty title ymap = do putStrLn title putStrLn $ take (length title) (repeat '=') mapM_ (putStrLn . formatDeadline) ymap putStrLn "" main :: IO () main = do Just yamlcache <- decodeFile "/home/report/tmp/yamlcache.yaml" currentTime <- getCurrentTime args <- getArgs let ymap = yamlcache statusdue = filter (\m -> statusFilter "Due" m) ymap userdue = if args == [] then statusdue else filter (\m -> elem (fromMaybe "UNASSIGNED" (Map.lookup "AssignedTo" m)) args) statusdue buggtime = sortBy dateSorter $ filter (dateFilter (=UTCTime (fromGregorian 2010 1 1) (secondsToDiffTime 0)))) userdue nexteightweeks = sortBy dateSorter $ filter (dateFilter (liftM2 (&&) (<(addUTCTime (56 * posixDayLength) currentTime)) (>=currentTime))) userdue printIfNonEmpty "Malformed Due Date" buggtime printIfNonEmpty "PAST DUE" beforenow printIfNonEmpty "Upcoming" nexteightweeks