chiasma-0.2.0.0: lib/Chiasma/Test/Screenshot.hs
module Chiasma.Test.Screenshot where
import Control.Monad.Free.Class (MonadFree)
import qualified Data.ByteString as ByteString (writeFile)
import qualified Data.Text as Text (lines, unlines)
import qualified Data.Text.Encoding as Text (encodeUtf8)
import System.FilePath (takeDirectory, (</>))
import UnliftIO.Directory (createDirectoryIfMissing, doesFileExist)
import Chiasma.Command.Pane (capturePane)
import Chiasma.Data.TmuxId (PaneId(PaneId))
import Chiasma.Data.TmuxThunk (TmuxThunk)
loadScreenshot :: MonadIO m => FilePath -> m (Maybe Text)
loadScreenshot path =
ifM (doesFileExist path) (Just . toText <$> liftIO (readFile path)) (pure Nothing)
storeScreenshot :: MonadIO m => FilePath -> [Text] -> m ()
storeScreenshot path text = do
createDirectoryIfMissing True (takeDirectory path)
liftIO $ ByteString.writeFile path (Text.encodeUtf8 . Text.unlines $ text)
takeScreenshot ::
MonadFree TmuxThunk m =>
MonadIO m =>
Int ->
m [Text]
takeScreenshot =
capturePane . PaneId
recordScreenshot ::
MonadFree TmuxThunk m =>
MonadIO m =>
FilePath ->
Int ->
m ()
recordScreenshot path paneId = do
current <- takeScreenshot paneId
storeScreenshot path current
testScreenshot ::
MonadFree TmuxThunk m =>
MonadIO m =>
FilePath ->
Int ->
m (Maybe ([Text], [Text]))
testScreenshot path pane = do
current <- takeScreenshot pane
loadScreenshot path >>= check current
where
check current (Just existing) =
return $ Just (current, Text.lines existing)
check current Nothing =
Nothing <$ storeScreenshot path current
screenshot ::
MonadFree TmuxThunk m =>
MonadIO m =>
Bool ->
FilePath ->
Text ->
Int ->
m (Maybe ([Text], [Text]))
screenshot record storage name paneId =
if record then Nothing <$ recordScreenshot path paneId else testScreenshot path paneId
where
path = storage </> toString name