{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ViewPatterns #-} import Data.Map (Map) import qualified Data.Map as Map import Data.Sequence (Seq) import qualified Data.Sequence as Seq import Data.Text (Text) import qualified Data.Text as T import qualified Data.ByteString.Lazy.Char8 as Lazy (ByteString) import qualified Data.ByteString.Lazy.Char8 as LCBS import Data.Time import Data.Foldable import Data.List import Data.Monoid import Control.Monad import Text.Show.Pretty (dumpStr) import Data.Aeson.Encode.Pretty (encodePretty) import System.IO import Thermoprint.Client import Options import Debug.Trace main :: IO () main = withArgs (main' <=< dumpOpts) where dumpOpts c@(TPrint{..}) = c <$ when (dumpOptions) (hPutStrLn stderr $ dumpStr c) main' config@(TPrint{..}) = withOutput config $ tprint config (mkClient' baseUrl) withOutput :: TPrint -> (Handle -> IO a) -> IO a withOutput TPrint{..} a | (_, WriteFile f) <- output = withFile f WriteMode a | otherwise = a stdout tprint :: TPrint -> Client IO -> Handle -> IO () tprint TPrint{ operation = Printers, ..} Client{..} out = printers >>= format where format ps | (Human, _) <- output = mapM_ (\(PrinterId n, st) -> hPutStrLn out $ show n ++ "\t" ++ humanStatus st) $ Map.toAscList ps | (JSON , _) <- output = LCBS.hPutStrLn out $ encodePretty ps | otherwise = hPutStrLn out . dumpStr $ Map.toAscList ps humanStatus (Busy (JobId n)) = "busy printing job #" ++ show n humanStatus (Available) = "available" tprint TPrint{ operation = Jobs{..}, ..} Client{..} out = jobs printer jobRange timeRange >>= format where format js | (Human, _) <- output = mapM_ (\((JobId n), created, status) -> hPutStrLn out $ show n ++ "\t" ++ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S %Z" created ++ "\t" ++ humanStatus status printer) . sortBy jSort $ toList js | (JSON, _) <- output = LCBS.hPutStrLn out $ encodePretty js | otherwise = hPutStrLn out . dumpStr $ toList js jSort (id, time, status) (id', time', status') = queueSort status status' <> compare time' time <> compare id id' where compare' :: Ord a => a -> a -> Ordering compare' | (Queued _) <- status = compare | otherwise = flip compare humanStatus (Queued (PrinterId n)) Nothing = "queued at printer #" ++ show n humanStatus (Queued _) _ = "queued" humanStatus (Printing (PrinterId n)) Nothing = "printing on printer #" ++ show n humanStatus (Printing _) _ = "printing" humanStatus (Done) _ = "finished successfully" humanStatus (Failed err) _ = "failed: " ++ show err tprint _ _ _ = undefined