module LoadEnv
    ( loadEnv
    , loadEnvFrom
    ) where


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.
-- Lines beginning with @#@ and blank lines are ignored. Trailing whitespace is
-- ignored. Quotes inside quoted values or spaces in unquoted values must be
-- escaped with a backlash. All else will result in a parse error being printed
-- to @stdout@.
--
-- 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 @"System.Env.Parse"@.
--
loadEnv :: IO ()
loadEnv = loadEnvFrom ".env"

loadEnvFrom :: FilePath -> IO ()
loadEnvFrom fp =
    parseFromFile parseEnvironment fp >>= either
        (putStrLn . show) (mapM_ $ uncurry setEnv)