module Development.GitRev.Utils.Environment
( LookupEnvError (..),
envValQ,
runInEnvDirQ,
withEnvValQ,
)
where
import Control.Exception
( Exception (displayException),
)
import Language.Haskell.TH (Q, runIO)
import Language.Haskell.TH.Syntax (Lift)
import System.Directory.OsPath qualified as Dir
import System.Environment qualified as Env
import System.OsPath qualified as OsPath
envValQ ::
String ->
Q (Either LookupEnvError String)
envValQ :: String -> Q (Either LookupEnvError String)
envValQ String
var = String -> (String -> Q String) -> Q (Either LookupEnvError String)
forall a. String -> (String -> Q a) -> Q (Either LookupEnvError a)
withEnvValQ String
var String -> Q String
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
runInEnvDirQ ::
forall a.
String ->
Q a ->
Q (Either LookupEnvError a)
runInEnvDirQ :: forall a. String -> Q a -> Q (Either LookupEnvError a)
runInEnvDirQ String
var Q a
m = String -> (String -> Q a) -> Q (Either LookupEnvError a)
forall a. String -> (String -> Q a) -> Q (Either LookupEnvError a)
withEnvValQ String
var ((String -> Q a) -> Q (Either LookupEnvError a))
-> (String -> Q a) -> Q (Either LookupEnvError a)
forall a b. (a -> b) -> a -> b
$ \String
repoDirFp -> do
repoDirOs <- String -> Q OsPath
forall (m :: * -> *). MonadThrow m => String -> m OsPath
OsPath.encodeUtf String
repoDirFp
currDir <- runIO Dir.getCurrentDirectory
runIO $ Dir.setCurrentDirectory repoDirOs
r <- m
runIO $ Dir.setCurrentDirectory currDir
pure $ r
newtype LookupEnvError = MkLookupEnvError String
deriving stock
(
LookupEnvError -> LookupEnvError -> Bool
(LookupEnvError -> LookupEnvError -> Bool)
-> (LookupEnvError -> LookupEnvError -> Bool) -> Eq LookupEnvError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LookupEnvError -> LookupEnvError -> Bool
== :: LookupEnvError -> LookupEnvError -> Bool
$c/= :: LookupEnvError -> LookupEnvError -> Bool
/= :: LookupEnvError -> LookupEnvError -> Bool
Eq,
(forall (m :: * -> *). Quote m => LookupEnvError -> m Exp)
-> (forall (m :: * -> *).
Quote m =>
LookupEnvError -> Code m LookupEnvError)
-> Lift LookupEnvError
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => LookupEnvError -> m Exp
forall (m :: * -> *).
Quote m =>
LookupEnvError -> Code m LookupEnvError
$clift :: forall (m :: * -> *). Quote m => LookupEnvError -> m Exp
lift :: forall (m :: * -> *). Quote m => LookupEnvError -> m Exp
$cliftTyped :: forall (m :: * -> *).
Quote m =>
LookupEnvError -> Code m LookupEnvError
liftTyped :: forall (m :: * -> *).
Quote m =>
LookupEnvError -> Code m LookupEnvError
Lift,
Int -> LookupEnvError -> ShowS
[LookupEnvError] -> ShowS
LookupEnvError -> String
(Int -> LookupEnvError -> ShowS)
-> (LookupEnvError -> String)
-> ([LookupEnvError] -> ShowS)
-> Show LookupEnvError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LookupEnvError -> ShowS
showsPrec :: Int -> LookupEnvError -> ShowS
$cshow :: LookupEnvError -> String
show :: LookupEnvError -> String
$cshowList :: [LookupEnvError] -> ShowS
showList :: [LookupEnvError] -> ShowS
Show
)
instance Exception LookupEnvError where
displayException :: LookupEnvError -> String
displayException (MkLookupEnvError String
var) =
String
"Failed to lookup environment variable: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
var
withEnvValQ ::
forall a.
String ->
(String -> Q a) ->
Q (Either LookupEnvError a)
withEnvValQ :: forall a. String -> (String -> Q a) -> Q (Either LookupEnvError a)
withEnvValQ String
var String -> Q a
onEnv = do
String -> Q (Maybe String)
lookupEnvQ String
var Q (Maybe String)
-> (Maybe String -> Q (Either LookupEnvError a))
-> Q (Either LookupEnvError a)
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe String
Nothing -> Either LookupEnvError a -> Q (Either LookupEnvError a)
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either LookupEnvError a -> Q (Either LookupEnvError a))
-> Either LookupEnvError a -> Q (Either LookupEnvError a)
forall a b. (a -> b) -> a -> b
$ LookupEnvError -> Either LookupEnvError a
forall a b. a -> Either a b
Left (LookupEnvError -> Either LookupEnvError a)
-> LookupEnvError -> Either LookupEnvError a
forall a b. (a -> b) -> a -> b
$ String -> LookupEnvError
MkLookupEnvError String
var
Just String
result -> a -> Either LookupEnvError a
forall a b. b -> Either a b
Right (a -> Either LookupEnvError a)
-> Q a -> Q (Either LookupEnvError a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Q a
onEnv String
result
lookupEnvQ :: String -> Q (Maybe String)
lookupEnvQ :: String -> Q (Maybe String)
lookupEnvQ = IO (Maybe String) -> Q (Maybe String)
forall a. IO a -> Q a
runIO (IO (Maybe String) -> Q (Maybe String))
-> (String -> IO (Maybe String)) -> String -> Q (Maybe String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO (Maybe String)
Env.lookupEnv