-- | 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