import System.FilePath ( (</>) )
import System.IO.Error ( catchIOError )
import System.Log ( Priority(..) )
+import Text.Read ( readMaybe )
-import Logging ( log_error ) -- Can't import report_error from Main
-import Terminal ( display_error ) -- 'cause of circular imports.
+import Backend ( Backend(..) )
+import ConnectionString ( ConnectionString )
+import Network.Services.TSN.Report ( report_error )
-- Derive standalone instances of Data and Typeable for Priority. This
--
data OptionalConfiguration =
OptionalConfiguration {
- connection_string :: Maybe String,
+ backend :: Maybe Backend,
+ connection_string :: Maybe ConnectionString,
log_file :: Maybe FilePath,
log_level :: Maybe Priority,
- syslog :: Maybe Bool }
+ syslog :: Maybe Bool,
+ xml_files :: [FilePath] }
deriving (Show, Data, Typeable)
--
instance Monoid OptionalConfiguration where
-- | An empty OptionalConfiguration.
- mempty = OptionalConfiguration Nothing Nothing Nothing Nothing
+ mempty = OptionalConfiguration Nothing Nothing Nothing Nothing Nothing []
-- | Combine @cfg1@ and @cfg2@, giving precedence to @cfg2@.
+ -- XML files can only be specified on the command-line, so we
+ -- just join them together here.
cfg1 `mappend` cfg2 =
OptionalConfiguration
+ (merge_maybes (backend cfg1) (backend cfg2))
(merge_maybes (connection_string cfg1) (connection_string cfg2))
(merge_maybes (log_file cfg1) (log_file cfg2))
(merge_maybes (log_level cfg1) (log_level cfg2))
(merge_maybes (syslog cfg1) (syslog cfg2))
-
+ ((xml_files cfg1) ++ (xml_files cfg2))
instance DCT.Configured Priority where
-- | This allows us to read a Priority level out of a Configurator
from_rc :: IO OptionalConfiguration
from_rc = do
etc <- catchIOError getSysconfDir (\e -> do
- display_error (show e)
- log_error (show e)
+ report_error (show e)
return "/etc")
home <- catchIOError getHomeDirectory (\e -> do
- display_error (show e)
- log_error (show e)
+ report_error (show e)
return "$(HOME)")
let global_config_path = etc </> "htsn-importrc"
let user_config_path = home </> ".htsn-importrc"
cfg <- DC.load [ DC.Optional global_config_path,
DC.Optional user_config_path ]
+ cfg_backend <- DC.lookup cfg "backend"
cfg_connection_string <- DC.lookup cfg "connection_string"
cfg_log_file <- DC.lookup cfg "log_file"
cfg_log_level <- DC.lookup cfg "log_level"
cfg_syslog <- DC.lookup cfg "syslog"
-
+ let cfg_xml_files = [] -- This won't be in the config file.
return $ OptionalConfiguration
+ (case cfg_backend of -- Try to convert a String to a Backend.
+ Nothing -> Nothing
+ Just s -> readMaybe s)
cfg_connection_string
cfg_log_file
cfg_log_level
cfg_syslog
+ cfg_xml_files