{-# LANGUAGE OverloadedStrings #-} module Config ( configUsage , Config(..) , getConfig ) where import Data.Maybe (catMaybes) 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 configUsage :: Text configUsage = T.intercalate "\n" [ T.concat [ "Please provide an url for leboncoin in the file named: " , T.pack configPath ] , "url = http://…" ] configPath :: FilePath configPath = "conf" data Config = Config { url :: URL } 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) . map T.strip . T.lines configFromMap :: Map Text Text -> Maybe Config configFromMap map = do url <- M.lookup "url" map return $ Config { url = url } lineConfig :: Text -> Maybe (Text, Text) lineConfig line = do (key, value) <- twoElementsList (map T.strip . T.splitOn "=" $ line) guard (T.length key > 0) return (key, value) twoElementsList :: [a] -> Maybe (a, a) twoElementsList [x, y] = Just (x, y) twoElementsLisst _ = Nothing