{-# LANGUAGE OverloadedStrings #-} module Config ( configUsage , Config(..) , getConfig ) where import Data.Maybe (catMaybes, isJust) import Data.Map (Map) import qualified Data.Map as M import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.IO as T import Control.Monad (guard) import System.Directory (doesFileExist) import Model.URL import Utils.Text configUsage :: Text configUsage = T.intercalate "\n" [ "" , T.concat [ " Some information is required in the file `" , T.pack configPath , "`:" ] , "" , " - url (required)" , " - mailTo (optional)" , "" , " Example:" , "" , " # The url field is required" , " url = http://www.leboncoin.fr/locations/offres/ile_de_france/?f=a&th=1" , "" , " # The mailTo field is an optional list" , " # mailTo = jean.dupont@mail.fr, john.smith@mail.com" ] configPath :: FilePath configPath = "conf" data Config = Config { url :: URL , mailTo :: Maybe [Text] } deriving (Eq, Read, Show) getConfig :: IO (Maybe Config) getConfig = do exists <- doesFileExist configPath if exists then configFromFile <$> T.readFile configPath else return Nothing configFromFile :: Text -> Maybe Config configFromFile = configFromMap . M.fromList . catMaybes . map lineConfig . filter (not . T.null) . filter (not . startsWith "#") . map T.strip . T.lines configFromMap :: Map Text Text -> Maybe Config configFromMap map = do url <- M.lookup "url" map let mailTo = fmap T.strip . T.splitOn "," <$> M.lookup "mailTo" map return $ Config { url = url, mailTo = mailTo } lineConfig :: Text -> Maybe (Text, Text) lineConfig line = do (key, value) <- keyValue line guard (T.length key > 0) return (key, value) keyValue :: Text -> Maybe (Text, Text) keyValue line = let sep = '=' in if isJust (T.find (== sep) line) then let key = T.takeWhile (/= sep) line value = T.drop 1 . T.dropWhile (/= sep) $ line in Just (T.strip key, T.strip value) else Nothing