module LoadEnv
    ( loadEnv
    , loadEnvFrom
    ) where


import Control.Monad (when)
import System.Directory (doesFileExist)
import System.Environment (setEnv)
import Text.Parsec.String (parseFromFile)

import LoadEnv.Parse

-- |
--
-- Parse @./.env@ for variable declariations. Set those variables in the
-- currently running process's environment. Variables can be declared in the
-- following form:
--
-- > FOO=bar
-- > FOO="bar"
-- > FOO='bar'
--
-- Declarations may optionally be preceded by @export@, which will be ignored.
-- Trailing whitespace is ignored. Quotes inside quoted values or spaces in
-- unquoted values must be escaped with a backlash.
--
-- Invalid lines are silently ignored.
--
-- If you wish to specify your own file, use @'loadEnvFrom'@. If you wish to
-- pass your own string or work with the parse result directly, use the
-- lower-level functions available in @"LoadEnv.Parse"@.
--
loadEnv :: IO ()
loadEnv = loadEnvFrom ".env"

loadEnvFrom :: FilePath -> IO ()
loadEnvFrom fp = do
    e <- doesFileExist fp

    when e $ parseFromFile parseEnvironment fp >>=
        either print (mapM_ $ uncurry setEnv)
