module Cachix.Api.Error
 ( escalate
 , escalateAs
 ) where

import Control.Exception              (Exception)
import Control.Monad.Catch            ( MonadThrow(throwM) )

{- | Examples:
    > escalate . maybeToEither err404

  | Note that exceptions gets handled by warp and logged (user sees just "Internal server")
-}
escalateAs :: (Exception exc, MonadThrow m)
          => (l -> exc)
          -> Either l a
          -> m a
escalateAs f = either (throwM . f) pure

escalate :: (Exception exc, MonadThrow m)
        => Either exc a
        -> m a
escalate = escalateAs id