packages feed

dotenv-0.3.2.0: app/Main.hs

{-# LANGUAGE CPP #-}

module Main where

#if MIN_VERSION_optparse_applicative(0,13,0)
import Data.Monoid ((<>))
#endif

import Options.Applicative

import Configuration.Dotenv (loadFile)

import Control.Monad.IO.Class(MonadIO(..))

import System.Process (system)
import System.Exit (exitWith)

data Options = Options
  { files    :: [String]
  , overload :: Bool
  , program  :: String
  , args     :: [String]
  } deriving (Show)

main :: IO ()
main = execParser opts >>= dotEnv
  where
    opts = info (helper <*> config)
      ( fullDesc
     <> progDesc "Runs PROGRAM after loading options from FILE"
     <> header "dotenv - loads options from dotenv files" )

config :: Parser Options
config = Options
     <$> some (strOption (
                  long "file"
                  <> short 'f'
                  <> metavar "FILE"
                  <> help "File to read for options" ))

     <*> switch ( long "overload"
                  <> short 'o'
                  <> help "Specify this flag to override existing variables" )

     <*> argument str (metavar "PROGRAM")

     <*> many (argument str (metavar "ARG"))

dotEnv :: MonadIO m => Options -> m ()
dotEnv opts = liftIO $ do
  mapM_ (loadFile (overload opts)) (files opts)
  code <- system (program opts ++ programArguments)
  exitWith code
  where
   programArguments = concatMap (" " ++) (args opts)