module Data.HttpSpec.MiscHelper
(errorToMaybe, errorToDefault, maybeToM, eitherToM, safeMain)
where
import Prelude hiding (catch)
import Control.Monad (liftM)
import Control.Monad.Error (MonadError, catchError)
import Control.Exception (catch,SomeException)
import System.IO (hPutStrLn,stderr)
import System.Exit (exitFailure)
import System.Environment (getProgName)
maybeToM :: Monad m => String -> Maybe a -> m a
maybeToM _msg (Just x) = return x
maybeToM msg Nothing = fail msg
errorToMaybe :: MonadError e m => m a -> m (Maybe a)
errorToMaybe ma = catchError (liftM Just ma) (\_ -> return Nothing)
errorToDefault :: MonadError e m => a -> m a -> m a
errorToDefault a ma = catchError ma (\_ -> return a)
eitherToM :: (Show a, Monad m) => Either a b -> m b
eitherToM (Left err) = fail (show err)
eitherToM (Right ok) = return ok
safeMain :: IO () -> IO ()
safeMain io = io `catch` handle
where
handle :: SomeException -> IO ()
handle e =
do s <- getProgName
hPutStrLn stderr ("Caught exception while running " ++ s ++ ": " ++ show e)
exitFailure