{-# LANGUAGE OverloadedStrings #-}
module Control.Error.Script (
Script,
runScript,
scriptIO
) where
import Control.Exception (try, SomeException)
import Control.Monad (liftM)
import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad.Trans.Except (ExceptT(ExceptT), runExceptT)
import Control.Error.Util (errLn)
import Data.EitherR (fmapL)
import Data.Monoid ((<>))
import Data.Text (Text)
import System.Environment (getProgName)
import System.Exit (exitFailure)
import Control.Monad.Trans.Class (lift)
import System.IO (stderr)
import qualified Data.Text
type Script = ExceptT Text IO
runScript :: Script a -> IO a
runScript s = do
e <- runExceptT s
case e of
Left e -> do
let adapt str = Data.Text.pack str <> ": " <> e
errLn =<< liftM adapt getProgName
exitFailure
Right a -> return a
scriptIO :: (MonadIO m) => IO a -> ExceptT Text m a
scriptIO = ExceptT
. liftIO
. liftM (fmapL (Data.Text.pack . show))
. (try :: IO a -> IO (Either SomeException a))