{-# LANGUAGE DoAndIfThenElse #-} module Main where import Control.Concurrent.ParallelIO (stopGlobalPool) import System.Directory (doesFileExist) import System.IO ( Handle, IOMode (WriteMode), openBinaryFile, stdout) import CommandLine (show_help) import Configuration (Cfg(..), get_cfg) import LWN.Article (real_article_path) import LWN.HTTP (get_login_cookie) import LWN.Page (epublish, page_from_url) -- | If we're given an empty path, return a handle to -- 'stdout'. Otherwise, open the given file and return a read/write -- handle to that. get_output_handle :: FilePath -> IO Handle get_output_handle path = if (null path) then return stdout else openBinaryFile path WriteMode argument_is_file :: Cfg -> IO Bool argument_is_file cfg = do path <- real_article_path (article cfg) doesFileExist path main :: IO () main = do cfg' <- get_cfg aif <- argument_is_file cfg' cfg <- case aif of False -> get_login_cookie cfg' True -> return cfg' page <- page_from_url cfg (article cfg) case page of Just p -> do output_handle <- get_output_handle (output cfg) epublish p output_handle Nothing -> do _ <- show_help return () -- Necessary, for some reason. stopGlobalPool