module Configuration.Dotenv
( load
, loadFile
, parseFile
, onMissingFile )
where
import Configuration.Dotenv.Parse (configParser)
import Control.Monad.Catch
import Control.Monad.IO.Class (MonadIO(..))
import System.Environment (lookupEnv)
import System.IO.Error (isDoesNotExistError)
import Text.Megaparsec (parse)
#if MIN_VERSION_base(4,7,0)
import System.Environment (setEnv)
#else
import System.Environment.Compat (setEnv)
#endif
load ::
MonadIO m =>
Bool
-> [(String, String)]
-> m ()
load override = mapM_ (applySetting override)
loadFile ::
MonadIO m =>
Bool
-> FilePath
-> m ()
loadFile override f = load override =<< parseFile f
parseFile ::
MonadIO m =>
FilePath
-> m [(String, String)]
parseFile f = do
contents <- liftIO $ readFile f
case parse configParser f contents of
Left e -> error $ "Failed to read file" ++ show e
Right options -> return options
applySetting :: MonadIO m => Bool -> (String, String) -> m ()
applySetting override (key, value) =
if override then
liftIO $ setEnv key value
else do
res <- liftIO $ lookupEnv key
case res of
Nothing -> liftIO $ setEnv key value
Just _ -> return ()
onMissingFile :: MonadCatch m
=> m a
-> m a
-> m a
onMissingFile f h = catchIf isDoesNotExistError f (const h)