nbparts-0.1.0.0: src/Nbparts/Run.hs
module Nbparts.Run
( Options (..),
Command (..),
run,
)
where
import Control.Monad.Error.Class (MonadError, throwError)
import Control.Monad.Except (ExceptT, runExceptT, withExceptT)
import Control.Monad.IO.Class (MonadIO)
import Nbparts.Pack (PackOptions)
import Nbparts.Pack qualified as Nbparts
import Nbparts.Types (NbpartsError (PackError, UnpackError))
import Nbparts.Unpack (UnpackOptions)
import Nbparts.Unpack qualified as Nbparts
newtype Options = Options
{ command :: Command
}
data Command = Unpack UnpackOptions | Pack PackOptions
run :: (MonadError NbpartsError m, MonadIO m) => Options -> m ()
run (Options command) = case command of
Unpack unpackOpts -> hoistError UnpackError $ Nbparts.unpack unpackOpts
Pack packOpts -> hoistError PackError $ Nbparts.pack packOpts
hoistError :: (MonadError e' m) => (e -> e') -> ExceptT e m a -> m a
hoistError mapErr action = do
res <- runExceptT $ withExceptT mapErr action
case res of
Right value -> pure value
Left err -> throwError err