+{-# LANGUAGE DoAndIfThenElse #-}
module Main
where
-data Article = Article { headline :: String,
- byline :: String,
- body_html :: String }
- deriving (Eq, Show)
+import Control.Concurrent.ParallelIO (stopGlobalPool)
+import System.Directory (doesFileExist)
+import System.IO (
+ Handle,
+ IOMode (WriteMode),
+ hPutStrLn,
+ openBinaryFile,
+ stderr,
+ stdout
+ )
-parse_article :: String -> String
-parse_article _ = ""
+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
- putStrLn "Hello, world."
+ 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
+ hPutStrLn stderr "ERROR: could not parse an LWN page from the given URL."
+ _ <- show_help
+ return ()
+
+ -- Necessary, for some reason.
+ stopGlobalPool