module Ribosome.Test.File where

import qualified Data.ByteString as ByteString (readFile)
import System.Directory (canonicalizePath, createDirectoryIfMissing, removePathForcibly)
import System.FilePath ((</>))

testDir :: Text -> IO FilePath
testDir :: Text -> IO FilePath
testDir = FilePath -> IO FilePath
canonicalizePath (FilePath -> IO FilePath)
-> (Text -> FilePath) -> Text -> IO FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> FilePath
forall a. ToString a => a -> FilePath
toString

-- raises exception if cwd is not the package root so we don't damage anything
tempDirIO :: Text -> FilePath -> IO FilePath
tempDirIO :: Text -> FilePath -> IO FilePath
tempDirIO Text
prefix FilePath
path = do
  FilePath
base <- Text -> IO FilePath
testDir Text
prefix
  let dir :: FilePath
dir = FilePath
base FilePath -> FilePath -> FilePath
</> FilePath
"temp"
  FilePath -> IO ()
removePathForcibly FilePath
dir
  Bool -> FilePath -> IO ()
createDirectoryIfMissing Bool
False FilePath
dir
  let absPath :: FilePath
absPath = FilePath
dir FilePath -> FilePath -> FilePath
</> FilePath
path
  Bool -> FilePath -> IO ()
createDirectoryIfMissing Bool
True FilePath
absPath
  return FilePath
absPath

tempDir :: MonadIO m => Text -> FilePath -> m FilePath
tempDir :: Text -> FilePath -> m FilePath
tempDir Text
prefix FilePath
path =
  IO FilePath -> m FilePath
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO FilePath -> m FilePath) -> IO FilePath -> m FilePath
forall a b. (a -> b) -> a -> b
$ Text -> FilePath -> IO FilePath
tempDirIO Text
prefix FilePath
path

fixture ::
  MonadIO m =>
  Text ->
  FilePath ->
  m FilePath
fixture :: Text -> FilePath -> m FilePath
fixture Text
prefix FilePath
path = do
  FilePath
base <- IO FilePath -> m FilePath
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO FilePath -> m FilePath) -> IO FilePath -> m FilePath
forall a b. (a -> b) -> a -> b
$ Text -> IO FilePath
testDir Text
prefix
  return $ FilePath
base FilePath -> FilePath -> FilePath
</> FilePath
"fixtures" FilePath -> FilePath -> FilePath
</> FilePath
path

fixtureContent ::
  MonadIO m =>
  Text ->
  FilePath ->
  m Text
fixtureContent :: Text -> FilePath -> m Text
fixtureContent Text
prefix FilePath
subPath = do
  FilePath
path <- Text -> FilePath -> m FilePath
forall (m :: * -> *). MonadIO m => Text -> FilePath -> m FilePath
fixture Text
prefix FilePath
subPath
  ByteString -> Text
forall a b. ConvertUtf8 a b => b -> a
decodeUtf8 (ByteString -> Text) -> m ByteString -> m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ByteString -> m ByteString
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (FilePath -> IO ByteString
ByteString.readFile FilePath
path)