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 = [Char] -> Q Exp
getRelPath [Char]
"ouroboros-consensus-cardano/golden"
getRelPath :: FilePath -> Q Exp
getRelPath :: [Char] -> Q Exp
getRelPath [Char]
relPath = do
absPath <- [Char] -> Q [Char]
makeRelativeToProject [Char]
relPath
useRel <- liftIO inNixBuild
liftData (if useRel then relPath else absPath)
inNixBuild :: IO Bool
inNixBuild :: IO Bool
inNixBuild = do
let testEnv :: [Char] -> IO Bool
testEnv = (Maybe [Char] -> Bool) -> IO (Maybe [Char]) -> 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 -> ([Char] -> Bool) -> Maybe [Char] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> ([Char] -> Bool) -> [Char] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)) (IO (Maybe [Char]) -> IO Bool)
-> ([Char] -> IO (Maybe [Char])) -> [Char] -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> IO (Maybe [Char])
lookupEnv
haveNixBuildDir <- [Char] -> IO Bool
testEnv [Char]
"NIX_BUILD_TOP"
inNixShell <- testEnv "IN_NIX_SHELL"
pure (haveNixBuildDir && not inNixShell)