X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FFeedHosts.hs;fp=src%2FFeedHosts.hs;h=b3fcc4827cd9688bed202d9c8b15669122644298;hb=da61a6744550e974688d46b23b11f1a842e4da2e;hp=0000000000000000000000000000000000000000;hpb=7de80b4fdfc8e4cef9144570be926fd02706fd2d;p=dead%2Fhtsn.git diff --git a/src/FeedHosts.hs b/src/FeedHosts.hs new file mode 100644 index 0000000..b3fcc48 --- /dev/null +++ b/src/FeedHosts.hs @@ -0,0 +1,57 @@ +{-# LANGUAGE DeriveDataTypeable #-} + +-- | A newtype around a list of Strings which represent the feed +-- hosts. This is all to avoid an orphan instance of Configured for +-- [String] if we had defined one in e.g. OptionalConfiguration. +-- +-- This was placed under the "TSN" namespace because its Default +-- instance is specific to TSN, even though otherwise it's just a +-- list of strings. +-- +module FeedHosts +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 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 + -- is a feed4.sportsnetwork.com, but it was not operational when + -- this was written. + def = FeedHosts ["feed1.sportsnetwork.com", + "feed2.sportsnetwork.com", + "feed3.sportsnetwork.com"] + + +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