--- /dev/null
+-- | A newtype around a list of Strings which represent hosts to look up.
+-- This is all to avoid an orphan instance of 'Configured' for
+-- [String] if we had defined one in e.g. 'OptionalConfiguration'.
+--
+{-# LANGUAGE DeriveDataTypeable #-}
+
+module Hosts ( Hosts(..) )
+where
+
+-- DC is needed only for the DCT.Configured instance of String.
+import qualified Data.Configurator as DC()
+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 hosts.
+--
+newtype Hosts =
+ Hosts { get_hosts :: [String] }
+ deriving (Data, Show, Typeable)
+
+
+-- | The default list of hosts. It's empty.
+--
+instance Default Hosts where def = Hosts []
+
+instance DCT.Configured Hosts where
+ -- | This allows us to read a Hosts 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 Hosts constructor to
+ -- it.
+ convert (DCT.List xs) =
+ -- mapM gives us a Maybe [String] here.
+ fmap Hosts (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