module Test.Util.Paths (
getGoldenDir
, getRelPath
, inNixBuild
) where
import Control.Monad.IO.Class (liftIO)
import Data.FileEmbed (makeRelativeToProject)
import Language.Haskell.TH.Syntax (Exp, Q, liftData)
import System.Environment (lookupEnv)
getGoldenDir :: Q Exp
getGoldenDir :: Q Exp
getGoldenDir = FilePath -> Q Exp
getRelPath FilePath
"golden"
getRelPath :: FilePath -> Q Exp
getRelPath :: FilePath -> Q Exp
getRelPath FilePath
relPath = do
FilePath
absPath <- FilePath -> Q FilePath
makeRelativeToProject FilePath
relPath
Bool
useRel <- IO Bool -> Q Bool
forall a. IO a -> Q a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Bool
inNixBuild
FilePath -> Q Exp
forall (m :: * -> *) a. (Quote m, Data a) => a -> m Exp
liftData (if Bool
useRel then FilePath
relPath else FilePath
absPath)
inNixBuild :: IO Bool
inNixBuild :: IO Bool
inNixBuild = do
let testEnv :: FilePath -> IO Bool
testEnv = (Maybe FilePath -> Bool) -> IO (Maybe FilePath) -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> (FilePath -> Bool) -> Maybe FilePath -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> (FilePath -> Bool) -> FilePath -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)) (IO (Maybe FilePath) -> IO Bool)
-> (FilePath -> IO (Maybe FilePath)) -> FilePath -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> IO (Maybe FilePath)
lookupEnv
Bool
haveNixBuildDir <- FilePath -> IO Bool
testEnv FilePath
"NIX_BUILD_TOP"
Bool
inNixShell <- FilePath -> IO Bool
testEnv FilePath
"IN_NIX_SHELL"
Bool -> IO Bool
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool
haveNixBuildDir Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
inNixShell)