{- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. -} -- | Transformers and exceptions. module SlackBuilder.Trans ( SlackBuilderException(..) , SlackBuilderT(..) , relativeToRepository ) where import Control.Monad.Trans.Reader (ReaderT(..), asks) import Data.Text (Text) import SlackBuilder.Config import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Catch (MonadCatch(..), MonadThrow(..)) import Control.Exception (Exception(..)) import System.FilePath (()) import Text.URI (URI) import qualified Codec.Compression.Lzma as Lzma data SlackBuilderException = UpdaterNotFound Text | HttpsUrlExpected URI | LzmaDecompressionFailed Lzma.LzmaRet deriving Show instance Exception SlackBuilderException newtype SlackBuilderT a = SlackBuilderT { runSlackBuilderT :: ReaderT Settings IO a } relativeToRepository :: FilePath -> SlackBuilderT FilePath relativeToRepository filePath = ( filePath) <$> SlackBuilderT (asks repository) instance Functor SlackBuilderT where fmap f (SlackBuilderT slackBuilderT) = SlackBuilderT $ f <$> slackBuilderT instance Applicative SlackBuilderT where pure = SlackBuilderT . pure (SlackBuilderT f) <*> (SlackBuilderT x) = SlackBuilderT $ f <*> x instance Monad SlackBuilderT where return = pure (SlackBuilderT x) >>= f = SlackBuilderT $ x >>= runSlackBuilderT . f instance MonadIO SlackBuilderT where liftIO = SlackBuilderT . liftIO instance MonadThrow SlackBuilderT where throwM = SlackBuilderT . throwM instance MonadCatch SlackBuilderT where catch (SlackBuilderT action) handler = SlackBuilderT $ catch action $ runSlackBuilderT . handler