{-# LANGUAGE OverloadedStrings #-}
module Control.Config where

import Prelude hiding (lines, readFile, drop)
import Data.Map (Map, fromList, union)
import Control.Monad.IO.Class (liftIO, MonadIO)
import Data.Text (breakOn, unpack, lines, dropAround, drop)
import Data.Text.IO (readFile)
import qualified System.Environment as System


type Environment = Map String String


loadEnvSystem :: (MonadIO m) => m Environment
loadEnvSystem = fromList <$> (liftIO $ System.getEnvironment)


loadEnvFile :: (MonadIO m) => FilePath -> m Environment
loadEnvFile = fmap (fromList . parseEnv) . liftIO . readFile
  where
    parseEnv = map (strings . breakOn "=") . lines
    strings (a, b) = (unpack a, unpack $ stripQuotes $ drop 1 b)
    stripQuotes = dropAround (== '"')


loadEnv :: MonadIO m => FilePath -> m Environment
loadEnv p = do
    s <- loadEnvSystem
    f <- loadEnvFile p
    pure $ union s f