cfenv-0.1.0.0: src/System/CloudFoundry/Environment/Internal/EnvVars.hs
{-# LANGUAGE RecordWildCards #-}
module System.CloudFoundry.Environment.Internal.EnvVars
( EnvVars(..)
, getEnvVars
) where
import Control.Monad ((>=>))
import Control.Exception (throw)
import Data.Maybe (fromMaybe)
import System.Environment (getEnv, lookupEnv)
import Text.Read (readMaybe)
import System.CloudFoundry.Environment.Internal.Types (CfEnvError(NotInteger))
data EnvVars = EnvVars
{ home :: String
, memoryLimit :: String
, pwd :: String
, port :: Int
, tmpDir :: String
, user :: String
, vcapApplication :: String
, vcapServices :: String
}
getEnvVars :: IO EnvVars
getEnvVars = do
home <- getEnvIO "HOME"
memoryLimit <- getEnvIO "MEMORY_LIMIT"
pwd <- getEnvIO "PWD"
port <- numberFromEnv "PORT"
tmpDir <- getEnvIO "TMPDIR"
user <- getEnvIO "USER"
vcapApplication <- getEnvIO "VCAP_APPLICATION"
vcapServices <- getEnvDefault "{}" "VCAP_SERVICES"
return EnvVars{..}
where
getEnvIO = getEnv
stringToInt :: String -> String -> IO Int
stringToInt envName str =
case readMaybe str of
Just int -> return int
Nothing -> throw $ NotInteger envName str
numberFromEnv :: String -> IO Int
numberFromEnv envName =
envVarValue envName >>= toInt
where
envVarValue = getEnv
toInt = stringToInt envName
getEnvDefault :: String -> String -> IO String
getEnvDefault def =
lookupEnv >=> return . fromMaybe def