imm-0.4.1.0: Imm/Boot.hs
module Imm.Boot where
-- {{{ Imports
import qualified Imm.Main as Main
import Imm.Types
import qualified Config.Dyre as D
import Config.Dyre.Paths
import System.Console.CmdArgs
import System.Console.CmdArgs.Explicit
import System.IO
-- }}}
-- | Available commandline options.
cliOptions :: Mode (CmdArgs CliOptions)
cliOptions = cmdArgsMode $ baseOptions
&= verbosityArgs [explicit, name "verbose", name "v"] []
&= versionArg [ignore]
&= help "Convert items from RSS/Atom feeds to maildir entries."
&= helpArg [explicit, name "help", name "h"]
&= program "imm"
where
baseOptions = CliOptions {
mCheck = def &= explicit &= name "c" &= name "check" &= help "Check availability and validity of all feed sources currently configured, without writing any mail.",
mFeedURI = def &= explicit &= name "f" &= name "feed" &= help "Only process given feed." &= typ "URI",
mImportOPML = def &= explicit &= name "i" &= name "import" &= help "Import feeds list from an OPML descriptor (read from stdin).",
mList = def &= explicit &= name "l" &= name "list" &= help "List all feed sources currently configured, along with their status.",
mMarkAsRead = def &= explicit &= name "R" &= name "mark-read" &= help "Mark every item of processed feeds as read, ie set last update as now without writing any mail.",
mMarkAsUnread = def &= explicit &= name "U" &= name "mark-unread" &= help "Mark every item of processed feeds as unread, ie delete corresponding state files.",
mUpdate = def &= explicit &= name "u" &= name "update" &= help "Update list of feeds (mostly used option)."}
-- {{{ Dynamic reconfiguration
-- | Print various paths used for dynamic reconfiguration.
printDyrePaths :: IO ()
printDyrePaths = do
(a, b, c, d, e) <- getPaths dyreParameters
putStrLn . unlines $ [
"Current binary: " ++ a,
"Custom binary: " ++ b,
"Config file: " ++ c,
"Cache directory: " ++ d,
"Lib directory: " ++ e, []]
-- | Dynamic reconfiguration settings.
dyreParameters :: D.Params (Either String FeedList)
dyreParameters = D.defaultParams {
D.projectName = "imm",
D.showError = showError,
D.realMain = realMain,
D.ghcOpts = ["-threaded"],
D.statusOut = hPutStrLn stderr
}
showError :: Either String a -> String -> Either String a
showError _ = Left
-- }}}
-- | Main function to call in the configuration file.
imm :: FeedList -> IO ()
imm = D.wrapMain dyreParameters . Right
-- | Internal dispatcher, decides which function to execute depending on commandline options.
realMain :: Either String FeedList -> IO ()
realMain (Left e) = putStrLn e
realMain (Right feeds) = do
whenLoud printDyrePaths
options <- cmdArgsRun cliOptions
let feeds' = case (mFeedURI options) of
Just uri -> filter (\(_, u) -> u == uri) feeds
_ -> feeds
realMain' (feeds', options)
where
realMain' (f, options)
| mCheck options = Main.check f
| mImportOPML options = Main.importOPML
| mList options = Main.list f
| mMarkAsRead options = Main.markAsRead f
| mMarkAsUnread options = Main.markAsUnread f
| mUpdate options = Main.update f
| otherwise = print $ helpText [] HelpFormatDefault cliOptions