load,
lookup )
import Data.Data ( Data )
-import Data.Typeable ( Typeable )
-import Data.Monoid ( Monoid(..) )
+import Data.Monoid ( Monoid() )
+import Data.Semigroup ( Semigroup() )
import Paths_mailbox_count ( getSysconfDir )
import System.Directory ( getHomeDirectory )
import System.FilePath ( (</>) )
--
data OptionalConfiguration =
OptionalConfiguration {
- both :: Maybe Bool,
database :: Maybe String,
detail :: Maybe Bool,
+ detail_query :: Maybe String,
host :: Maybe String,
password :: Maybe String,
port :: Maybe Int,
+ summary_query :: Maybe String,
username :: Maybe String }
- deriving (Show, Data, Typeable)
+ deriving (Show, Data)
-- | Combine two Maybes into one, essentially mashing them
merge_maybes (Just _) (Just y) = Just y
--- | The Monoid instance for these lets us "combine" two
--- OptionalConfigurations. The "combine" operation that we'd like to
--- perform is, essentially, to mash them together. So if we have two
+-- | The Semigroup instance for these lets us "combine" two
+-- configurations. The "combine" operation that we'd like to perform
+-- is, essentially, to mash them together. So if we have two
-- OptionalConfigurations, each half full, we could combine them
-- into one big one.
--
-- This is used to merge command-line and config-file settings.
--
+instance Semigroup OptionalConfiguration where
+ -- | Combine @cfg1@ and @cfg2@, giving precedence to @cfg2@.
+ cfg1 <> cfg2 =
+ OptionalConfiguration
+ (merge_maybes (database cfg1) (database cfg2))
+ (merge_maybes (detail cfg1) (detail cfg2))
+ (merge_maybes (detail_query cfg1) (detail_query cfg2))
+ (merge_maybes (host cfg1) (host cfg2))
+ (merge_maybes (password cfg1) (password cfg2))
+ (merge_maybes (port cfg1) (port cfg2))
+ (merge_maybes (summary_query cfg1) (summary_query cfg2))
+ (merge_maybes (username cfg1) (username cfg2))
+
+
+-- | The Monoid instance essentially only provides the "empty
+-- configuration."
instance Monoid OptionalConfiguration where
-- | An empty OptionalConfiguration.
mempty = OptionalConfiguration
Nothing
Nothing
Nothing
-
- -- | Combine @cfg1@ and @cfg2@, giving precedence to @cfg2@.
- cfg1 `mappend` cfg2 =
- OptionalConfiguration
- (merge_maybes (both cfg1) (both cfg2))
- (merge_maybes (database cfg1) (database cfg2))
- (merge_maybes (detail cfg1) (detail cfg2))
- (merge_maybes (host cfg1) (host cfg2))
- (merge_maybes (password cfg1) (password cfg2))
- (merge_maybes (port cfg1) (port cfg2))
- (merge_maybes (username cfg1) (username cfg2))
+ Nothing
+ mappend = (<>)
-- | Obtain an OptionalConfiguration from mailbox-countrc in either
let user_config_path = home </> ".mailbox-countrc"
cfg <- DC.load [ DC.Optional global_config_path,
DC.Optional user_config_path ]
- cfg_both <- DC.lookup cfg "both"
cfg_database <- DC.lookup cfg "database"
cfg_detail <- DC.lookup cfg "detail"
+ cfg_detail_query <- DC.lookup cfg "detail_query"
cfg_host <- DC.lookup cfg "host"
cfg_password <- DC.lookup cfg "password"
cfg_port <- DC.lookup cfg "port"
+ cfg_summary_query <- DC.lookup cfg "summary_query"
cfg_username <- DC.lookup cfg "username"
return $ OptionalConfiguration
- cfg_both
cfg_database
cfg_detail
+ cfg_detail_query
cfg_host
cfg_password
cfg_port
+ cfg_summary_query
cfg_username