-- | This module defines the 'Cfg' type, which is just a wrapper
-- around all of the configuration options we accept on the command
-- line. We thread this throughout the rest of the program.
+--
+
module Configuration (
- Cfg(..)
-)
+ Cfg(..),
+ merge_optional )
where
-data Cfg = Cfg { heartbeat :: Int,
- ignore_replies :: Bool,
- ignore_retweets :: Bool,
- from_address :: Maybe String,
- to_address :: Maybe String,
- verbose :: Bool }
+import System.Console.CmdArgs.Default ( Default(..) )
+
+import qualified OptionalConfiguration as OC ( OptionalCfg(..) )
+import Usernames ( Usernames(..) )
+
+
+-- | The main configuration data type. It contains all options that
+-- can be set in a config file or on the command line.
+--
+data Cfg =
+ Cfg { consumer_key :: String,
+ consumer_secret :: String,
+ access_token :: String,
+ access_secret :: String,
+ heartbeat :: Int,
+ ignore_replies :: Bool,
+ ignore_retweets :: Bool,
+ sendmail_path :: FilePath,
+ from_address :: Maybe String,
+ to_address :: Maybe String,
+ verbose :: Bool,
+ usernames :: Usernames }
+ deriving (Show)
+
+
+instance Default Cfg where
+ -- | A 'Cfg' with all of its fields set to their default values.
+ --
+ def = Cfg { consumer_key = def,
+ consumer_secret = def,
+ access_token = def,
+ access_secret = def,
+ heartbeat = 600,
+ ignore_replies = def,
+ ignore_retweets = def,
+ sendmail_path = "/usr/sbin/sendmail",
+ from_address = def,
+ to_address = def,
+ verbose = def,
+ usernames = def }
+
+
+-- | Merge a 'Cfg' with an 'OptionalCfg'. This is more or less the
+-- Monoid instance for 'OptionalCfg', but since the two types are
+-- different, we have to repeat ourselves.
+--
+merge_optional :: Cfg -> OC.OptionalCfg -> Cfg
+merge_optional cfg opt_cfg =
+ Cfg
+ (merge (consumer_key cfg) (OC.consumer_key opt_cfg))
+ (merge (consumer_secret cfg) (OC.consumer_secret opt_cfg))
+ (merge (access_token cfg) (OC.access_token opt_cfg))
+ (merge (access_secret cfg) (OC.access_secret opt_cfg))
+ (merge (heartbeat cfg) (OC.heartbeat opt_cfg))
+ (merge (ignore_replies cfg) (OC.ignore_replies opt_cfg))
+ (merge (ignore_retweets cfg) (OC.ignore_retweets opt_cfg))
+ (merge (sendmail_path cfg) (OC.sendmail_path opt_cfg))
+ (merge' (from_address cfg) (OC.from_address opt_cfg))
+ (merge' (to_address cfg) (OC.to_address opt_cfg))
+ (merge (verbose cfg) (OC.verbose opt_cfg))
+ all_usernames
+ where
+ merge :: a -> Maybe a -> a
+ merge x Nothing = x
+ merge _ (Just y) = y
+
+ -- Used for the to/from address
+ merge' :: Maybe a -> Maybe a -> Maybe a
+ merge' Nothing Nothing = Nothing
+ merge' (Just x) Nothing = Just x
+ merge' Nothing (Just x) = Just x
+ merge' (Just _) (Just y) = Just y
+
+ -- If there are any optional usernames, use only those.
+ all_usernames = if (null (get_usernames (OC.usernames opt_cfg)))
+ then (usernames cfg)
+ else (OC.usernames opt_cfg)