tv th-env: init at 1.0.0

This commit is contained in:
tv 2020-10-03 01:23:07 +02:00
parent 2299f49864
commit 0cbb18c16e
3 changed files with 79 additions and 0 deletions

View file

@ -0,0 +1,10 @@
{ mkDerivation, base, stdenv, template-haskell, text }:
mkDerivation {
pname = "th-env";
version = "1.0.0";
src = ./.;
libraryHaskellDepends = [ base template-haskell text ];
homepage = "https://stackoverflow.com/q/57635686";
license = "unknown";
hydraPlatforms = stdenv.lib.platforms.none;
}

View file

@ -0,0 +1,49 @@
{-# 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

View file

@ -0,0 +1,20 @@
name: th-env
version: 1.0.0
-- license: https://creativecommons.org/licenses/by-sa/4.0/
license: OtherLicense
author: https://stackoverflow.com/users/9348482
homepage: https://stackoverflow.com/q/57635686
maintainer: tv <tv@krebsco.de>
build-type: Simple
cabal-version: >=1.10
library
hs-source-dirs: src
build-depends:
base,
template-haskell,
text
exposed-modules:
THEnv
default-language: Haskell2010
ghc-options: -O2 -Wall