50 lines
1.7 KiB
Haskell
50 lines
1.7 KiB
Haskell
|
{-# LANGUAGE TemplateHaskell #-}
|
||
|
module THEnv
|
||
|
(
|
||
|
-- * Compile-time configuration
|
||
|
lookupCompileEnv
|
||
|
, lookupCompileEnvExp
|
||
|
, getCompileEnv
|
||
|
, getCompileEnvExp
|
||
|
, fileAsString
|
||
|
) where
|
||
|
|
||
|
import Control.Monad
|
||
|
import qualified Data.Text as T
|
||
|
import qualified Data.Text.IO as T
|
||
|
import Language.Haskell.TH
|
||
|
import Language.Haskell.TH.Syntax (Lift(..))
|
||
|
import System.Environment (getEnvironment)
|
||
|
|
||
|
-- Functions that work with compile-time configuration
|
||
|
|
||
|
-- | Looks up a compile-time environment variable.
|
||
|
lookupCompileEnv :: String -> Q (Maybe String)
|
||
|
lookupCompileEnv key = lookup key `liftM` runIO getEnvironment
|
||
|
|
||
|
-- | Looks up a compile-time environment variable. The result is a TH
|
||
|
-- expression of type @Maybe String@.
|
||
|
lookupCompileEnvExp :: String -> Q Exp
|
||
|
lookupCompileEnvExp = (`sigE` [t| Maybe String |]) . lift <=< lookupCompileEnv
|
||
|
-- We need to explicly type the result so that things like `print Nothing`
|
||
|
-- work.
|
||
|
|
||
|
-- | Looks up an compile-time environment variable and fail, if it's not
|
||
|
-- present.
|
||
|
getCompileEnv :: String -> Q String
|
||
|
getCompileEnv key =
|
||
|
lookupCompileEnv key >>=
|
||
|
maybe (fail $ "Environment variable " ++ key ++ " not defined") return
|
||
|
|
||
|
-- | Looks up an compile-time environment variable and fail, if it's not
|
||
|
-- present. The result is a TH expression of type @String@.
|
||
|
getCompileEnvExp :: String -> Q Exp
|
||
|
getCompileEnvExp = lift <=< getCompileEnv
|
||
|
|
||
|
-- | Loads the content of a file as a string constant expression.
|
||
|
-- The given path is relative to the source directory.
|
||
|
fileAsString :: FilePath -> Q Exp
|
||
|
fileAsString = do
|
||
|
-- addDependentFile path -- works only with template-haskell >= 2.7
|
||
|
stringE . T.unpack . T.strip <=< runIO . T.readFile
|