]> gitweb.michael.orlitzky.com - dead/halcyon.git/blobdiff - src/Configuration.hs
Clean up a bunch of code and comments.
[dead/halcyon.git] / src / Configuration.hs
index 39dd4e6f4cc46a58cd63be81471bbf2a80cfcbc0..c2136431577a574cd2ace86a67e93dc7d3747e2d 100644 (file)
@@ -5,13 +5,18 @@
 
 module Configuration (
   Cfg(..),
-  default_config,
-  merge_optional
-)
+  merge_optional )
 where
 
-import qualified OptionalConfiguration as OC
+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,
@@ -20,29 +25,35 @@ data Cfg =
         heartbeat :: Int,
         ignore_replies :: Bool,
         ignore_retweets :: Bool,
-        sendmail_path :: String,
+        sendmail_path :: FilePath,
         from_address :: Maybe String,
         to_address :: Maybe String,
         verbose :: Bool,
-        usernames :: [String] }
+        usernames :: Usernames }
     deriving (Show)
 
 
-default_config :: Cfg
-default_config =
-  Cfg { consumer_key = "",
-        consumer_secret = "",
-        access_token = "",
-        access_secret = "",
-        heartbeat = 600,
-        ignore_replies = False,
-        ignore_retweets = False,
-        sendmail_path = "/usr/sbin/sendmail",
-        from_address = Nothing,
-        to_address = Nothing,
-        verbose = False,
-        usernames = [] }
+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
@@ -57,7 +68,7 @@ merge_optional cfg 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))
-    ((usernames cfg) ++ (OC.usernames opt_cfg))
+    all_usernames
   where
     merge :: a -> Maybe a -> a
     merge x Nothing  = x
@@ -69,3 +80,8 @@ merge_optional cfg opt_cfg =
     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)