{-# LANGUAGE FlexibleInstances, TemplateHaskell #-} module Imm.Config where -- {{{ Imports import Imm.Util import Control.Lens import Control.Monad.Base import Control.Monad.Reader hiding(forM_) import Data.Char import Data.Foldable hiding(concat) import Data.Text.ICU.Convert import Data.Time import Text.Feed.Types as F -- }}} -- {{{ Types type Format = (Item, Feed) -> String data Config = Config { _maildir :: FilePath, -- ^ Where mails will be written _dateParsers :: [String -> Maybe UTCTime], -- ^ List of date parsing functions, will be tried sequentially until one succeeds _formatFrom :: Format, -- ^ Called to write the From: header of feed mails _formatSubject :: Format, -- ^ Called to write the Subject: header of feed mails _formatBody :: Format, -- ^ Called to write the body of feed mails (sic!) _decoder :: String -- ^ 'Converter' name used to decode the HTTP response from a feed URI -- _decoder :: BL.ByteString -> Maybe TL.Text -- ^ Called to decode the HTTP response from a feed URI } makeLenses ''Config -- | 'MonadReader' for 'Config' class ConfigReader m where readConfig :: Simple Lens Config a -> m a instance (Monad m) => ConfigReader (ReaderT Config m) where readConfig l = return . view l =<< ask instance ConfigReader ((->) Config) where readConfig l = view l -- }}} -- | Return the decoder corresponding to the converter name set in 'Config'. getDecoder :: (ConfigReader m, MonadBase IO m) => m Converter getDecoder = do converterName <- readConfig decoder io $ open converterName Nothing -- | Return the Haskell code to write in the configuration file to add a feed. addFeeds :: MonadBase IO m => [(String, [String])] -> m () addFeeds feeds = io . forM_ feeds $ \(groupTitle, uris) -> do putStrLn $ "-- Group " ++ groupTitle putStrLn $ map toLower (concat . words $ groupTitle) ++ " = [" forM_ uris (\uri -> putStrLn $ " " ++ show uri ++ ",") putStrLn "]" putStrLn ""