packages feed

polysemy-test-0.1.0.0: lib/Polysemy/Test/Files.hs

{-# OPTIONS_HADDOCK hide #-}

module Polysemy.Test.Files where

import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Path (Abs, Dir, File, Path, Rel, parent, reldir, toFilePath, (</>))
import Path.IO (createDirIfMissing)

tempPath ::
  Path Abs Dir ->
  Path Rel b ->
  Path Abs b
tempPath base path =
  base </> [reldir|temp|] </> path

tempDir ::
  Member (Embed IO) r =>
  Path Abs Dir ->
  Path Rel Dir ->
  Sem r (Path Abs Dir)
tempDir base path = do
  embed (createDirIfMissing @IO True fullPath)
  pure fullPath
  where
    fullPath =
      tempPath base path

readFile ::
  Member (Embed IO) r =>
  Path Abs File ->
  Sem r Text
readFile path =
  embed (Text.readFile (toFilePath path))

tempFile ::
  Member (Embed IO) r =>
  Path Abs Dir ->
  [Text] ->
  Path Rel File ->
  Sem r (Path Abs File)
tempFile base content path = do
  void (tempDir base (parent path))
  fullPath <$ embed (Text.writeFile (toFilePath fullPath) (Text.intercalate "\n" content))
  where
    fullPath =
      tempPath base path

tempFileContent ::
  Member (Embed IO) r =>
  Path Abs Dir ->
  Path Rel File ->
  Sem r Text
tempFileContent base path =
  readFile (tempPath base path)

fixturePath ::
  Path Abs Dir ->
  Path Rel p ->
  Sem r (Path Abs p)
fixturePath base path = do
  return $ base </> [reldir|fixtures|] </> path

fixture ::
  Member (Embed IO) r =>
  Path Abs Dir ->
  Path Rel File ->
  Sem r Text
fixture base subPath = do
  readFile =<< fixturePath base subPath