X-Git-Url: http://gitweb.michael.orlitzky.com/?p=dead%2Fharbl.git;a=blobdiff_plain;f=harbl-cli%2Fsrc%2FLists.hs;fp=harbl-cli%2Fsrc%2FLists.hs;h=8edb167e30685abbd37b777dde3506e19bda7243;hp=0000000000000000000000000000000000000000;hb=b55e5db2a68be5d69b970bbe4b5ad447881abd3d;hpb=c4d41b93ec02ff4dc762163441ebefb0324e6f07 diff --git a/harbl-cli/src/Lists.hs b/harbl-cli/src/Lists.hs new file mode 100644 index 0000000..8edb167 --- /dev/null +++ b/harbl-cli/src/Lists.hs @@ -0,0 +1,47 @@ +-- | A newtype around a list of Strings representing blacklists. +-- This is all to avoid an orphan instance of 'Configured' for +-- [String] if we had defined one in e.g. 'OptionalConfiguration'. +-- +{-# LANGUAGE DeriveDataTypeable #-} + +module Lists ( Lists(..) ) +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 blacklists. +-- +newtype Lists = + Lists { get_lists :: [String] } + deriving (Data, Show, Typeable) + + +-- | The default list of white/blacklists. It's empty. +-- +instance Default Lists where def = Lists [] + +instance DCT.Configured Lists where + -- | This allows us to read a 'Lists' 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 Lists constructor to + -- it. + convert (DCT.List xs) = + -- mapM gives us a Maybe [String] here. + fmap Lists (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