import Data.Maybe (fromJust, isJust, isNothing)
import System.Console.GetOpt
+import System.Directory (doesFileExist)
import System.Environment (getArgs)
import Configuration (Cfg(..))
opt_help :: Bool,
opt_ignore_replies :: Bool,
opt_ignore_retweets :: Bool,
+ opt_sendmail_path :: FilePath,
opt_from :: Maybe String,
opt_to :: Maybe String,
opt_verbose :: Bool }
opt_help = False,
opt_ignore_replies = False,
opt_ignore_retweets = False,
+ opt_sendmail_path = "/usr/sbin/sendmail",
opt_from = Nothing,
opt_to = Nothing,
opt_verbose = False }
(ReqArg set_from "email_address")
"Send tweets FROM email_address.",
+ Option
+ ['s']["sendmail_path"]
+ (ReqArg set_sendmail_path "sendmail_path")
+ "Use sendmail_path to send mail",
+
Option
['i']["ignore-replies"]
(NoArg set_ignore_replies)
set_verbose opts =
return opts { opt_verbose = True }
+set_sendmail_path :: String -> Options -> IO Options
+set_sendmail_path arg opts = do
+ return opts { opt_sendmail_path = arg }
+
set_to :: String -> Options -> IO Options
set_to arg opts = do
return opts { opt_to = Just arg }
-- | The usage header.
usage :: String
-usage = "Usage: twat [-n heartbeat] [-t to_address] [-f from_address] <username1> [username2, [username3]...]"
+usage = "Usage: twat [-n heartbeat] [-t to_address] [-f from_address] [-s path-to-sendmail] <username1> [username2, [username3]...]"
-- | Was the help option passed?
then return ["\"heartbeat\" does not appear to be an integer."]
else return []
--- |Parse errors relating to the list of usernames.
+-- | Parse errors relating to the list of usernames.
username_errors :: IO [String]
username_errors = do
argv <- getArgs
else return []
--- |Parse errors relating to the "To" address.
+-- | Parse errors relating to the "To" address.
to_errors :: IO [String]
to_errors = do
toaddr <- parse_to_address
else return []
+-- | Errors for the sendmail path argument.
+sendmail_path_errors :: IO [String]
+sendmail_path_errors = do
+ sendmail <- parse_sendmail_path
+ exists <- doesFileExist sendmail
+ if (not exists)
+ then return ["sendmail path does not exist"]
+ else return []
+
+
-- | Parse errors relating to the "From" address.
from_errors :: IO [String]
from_errors = do
errs_username <- username_errors
errs_to <- to_errors
errs_from <- from_errors
+ errs_sendmail <- sendmail_path_errors
return $ map format_error (errors ++
errs_heartbeat ++
errs_username ++
+ errs_sendmail ++
errs_to ++
errs_from)
opts <- parse_options
return (opt_to opts)
+-- | What sendmail path was given on the command line?
+parse_sendmail_path :: IO FilePath
+parse_sendmail_path = do
+ opts <- parse_options
+ return (opt_sendmail_path opts)
+
-- | What "From" address was given on the command line?
parse_from_address :: IO (Maybe String)
parse_from_address = do
return Cfg { heartbeat = fromJust $ opt_heartbeat opts,
ignore_replies = opt_ignore_replies opts,
ignore_retweets = opt_ignore_retweets opts,
+ sendmail_path = opt_sendmail_path opts,
from_address = opt_from opts,
to_address = opt_to opts,
verbose = opt_verbose opts }