module General.Paths(
rattleVersionString,
initDataDirectory,
readDataFileHTML
) where
import Paths_rattle
import Control.Exception
import Control.Monad.Extra
import Data.Version
import System.Directory
import System.FilePath
import System.IO.Unsafe
import System.Environment
import General.Extra
import qualified Data.ByteString.Lazy as LBS
rattleVersionString :: String
rattleVersionString = showVersion version
{-# NOINLINE dataDirs #-}
dataDirs :: [String]
dataDirs = unsafePerformIO $ do
datdir <- getDataDir
exedir <- takeDirectory <$> getExecutablePath `catchIO` \_ -> pure ""
curdir <- getCurrentDirectory
pure $ [datdir] ++ [exedir | exedir /= ""] ++ [curdir]
initDataDirectory :: IO ()
initDataDirectory = void $ evaluate dataDirs
getDataFile :: FilePath -> IO FilePath
getDataFile file = do
let poss = map (</> file) dataDirs
res <- filterM doesFileExist_ poss
case res of
[] -> fail $ unlines $ ("Could not find data file " ++ file ++ ", looked in:") : map (" " ++) poss
x:_ -> pure x
readDataFileHTML :: FilePath -> IO LBS.ByteString
readDataFileHTML file = LBS.readFile =<< getDataFile ("html" </> file)