-- DC is needed only for the DCT.Configured instance of String.
import qualified Data.Configurator as DC()
-import qualified Data.Configurator.Types as DCT
+import qualified Data.Configurator.Types as DCT (
+ Configured,
+ Value( List ),
+ convert )
import Data.Data (Data)
import System.Console.CmdArgs.Default (Default(..))
import Data.Typeable (Typeable)
+-- | A (wrapper around a) list of hostnames that supply the XML feed.
+--
newtype FeedHosts =
FeedHosts { get_feed_hosts :: [String] }
deriving (Data, Show, Typeable)
+
instance Default FeedHosts where
-- | The default list of feed hosts. These were found by checking
-- PTR records in the neighborhood of the IP address in use. There
instance DCT.Configured FeedHosts where
+ -- | This allows us to read a FeedHosts object out of a Configurator
+ -- config file. By default Configurator wouldn't know what to do,
+ -- so we have to tell it that we expect a list, and if that list
+ -- has strings in it, we can apply the FeedHosts constructor to
+ -- it.
convert (DCT.List xs) =
+ -- mapM gives us a Maybe [String] here.
fmap FeedHosts (mapM convert_string xs)
where
convert_string :: DCT.Value -> Maybe String
convert_string = DCT.convert
+ -- If we read anything other than a list of values out of the file,
+ -- fail.
convert _ = Nothing
-