-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Extensible exceptions for servant API servers -- -- `servant-exceptions-server` provides the `servant-server` related -- parts for `servant-exceptions`. Namely it catches declared exceptions -- and renders responses using the handler content-type. @package servant-exceptions-server @version 0.2.1 -- | HasServer instances for the Throws api combinator. module Servant.Exception.Server -- | Declare that an API might throw errors of given type e. data Throws e -- | Type class to convert an e to servant's error types, e.g. -- ServerError on the server side. Thus, servers use methods of -- this class, along with Typeable and Show allow -- convenient definition of how error responses should look like. class (Typeable e, Show e) => ToServantErr e -- | HTTP status code to return status :: ToServantErr e => e -> Status -- | A human-readable message to include. Default implementation uses -- Show. message :: ToServantErr e => e -> Text -- | Additional headers to include in the response. Content-type headers -- are created by default. headers :: ToServantErr e => e -> [Header] -- | A root exception type (see Exception) to provide a common -- rendering format via MimeRender for builtin content types -- JSON and PlainText. data ServantException toServantException :: (Exception e, ToJSON e, ToServantErr e) => e -> SomeException fromServantException :: Exception e => SomeException -> Maybe e -- | Any type that you wish to throw or catch as an exception must be an -- instance of the Exception class. The simplest case is a new -- exception type directly below the root: -- --
--   data MyException = ThisException | ThatException
--       deriving Show
--   
--   instance Exception MyException
--   
-- -- The default method definitions in the Exception class do what -- we need in this case. You can now throw and catch -- ThisException and ThatException as exceptions: -- --
--   *Main> throw ThisException `catch` \e -> putStrLn ("Caught " ++ show (e :: MyException))
--   Caught ThisException
--   
-- -- In more complicated examples, you may wish to define a whole hierarchy -- of exceptions: -- --
--   ---------------------------------------------------------------------
--   -- Make the root exception type for all the exceptions in a compiler
--   
--   data SomeCompilerException = forall e . Exception e => SomeCompilerException e
--   
--   instance Show SomeCompilerException where
--       show (SomeCompilerException e) = show e
--   
--   instance Exception SomeCompilerException
--   
--   compilerExceptionToException :: Exception e => e -> SomeException
--   compilerExceptionToException = toException . SomeCompilerException
--   
--   compilerExceptionFromException :: Exception e => SomeException -> Maybe e
--   compilerExceptionFromException x = do
--       SomeCompilerException a <- fromException x
--       cast a
--   
--   ---------------------------------------------------------------------
--   -- Make a subhierarchy for exceptions in the frontend of the compiler
--   
--   data SomeFrontendException = forall e . Exception e => SomeFrontendException e
--   
--   instance Show SomeFrontendException where
--       show (SomeFrontendException e) = show e
--   
--   instance Exception SomeFrontendException where
--       toException = compilerExceptionToException
--       fromException = compilerExceptionFromException
--   
--   frontendExceptionToException :: Exception e => e -> SomeException
--   frontendExceptionToException = toException . SomeFrontendException
--   
--   frontendExceptionFromException :: Exception e => SomeException -> Maybe e
--   frontendExceptionFromException x = do
--       SomeFrontendException a <- fromException x
--       cast a
--   
--   ---------------------------------------------------------------------
--   -- Make an exception type for a particular frontend compiler exception
--   
--   data MismatchedParentheses = MismatchedParentheses
--       deriving Show
--   
--   instance Exception MismatchedParentheses where
--       toException   = frontendExceptionToException
--       fromException = frontendExceptionFromException
--   
-- -- We can now catch a MismatchedParentheses exception as -- MismatchedParentheses, SomeFrontendException or -- SomeCompilerException, but not other types, e.g. -- IOException: -- --
--   *Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: MismatchedParentheses))
--   Caught MismatchedParentheses
--   *Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: SomeFrontendException))
--   Caught MismatchedParentheses
--   *Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException))
--   Caught MismatchedParentheses
--   *Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: IOException))
--   *** Exception: MismatchedParentheses
--   
class (Typeable e, Show e) => Exception e toException :: Exception e => e -> SomeException fromException :: Exception e => SomeException -> Maybe e -- | Render this exception value in a human-friendly manner. -- -- Default implementation: show. displayException :: Exception e => e -> String -- | Catch and rethrow using mapping function f. mapException :: (Exception e1, Exception e2, MonadCatch m) => (e1 -> e2) -> m a -> m a instance forall e (ct :: [*]) k (mt :: k) (st :: GHC.Types.Nat) a (context :: [*]). (GHC.Exception.Type.Exception e, Servant.Exception.ToServantErr e, Servant.API.ContentTypes.AllMimeRender ct e, Servant.Server.Internal.HasServer (Servant.API.Verbs.Verb mt st ct a) context) => Servant.Server.Internal.HasServer (Servant.Exception.Throws e Servant.API.Sub.:> Servant.API.Verbs.Verb mt st ct a) context instance forall k (api :: k) e upstream (context :: [*]). Servant.Server.Internal.HasServer (api Servant.API.Sub.:> (Servant.Exception.Throws e Servant.API.Sub.:> upstream)) context => Servant.Server.Internal.HasServer (Servant.Exception.Throws e Servant.API.Sub.:> (api Servant.API.Sub.:> upstream)) context instance Servant.Server.Internal.HasServer ((Servant.Exception.Throws e Servant.API.Sub.:> api1) Servant.API.Alternative.:<|> (Servant.Exception.Throws e Servant.API.Sub.:> api2)) context => Servant.Server.Internal.HasServer (Servant.Exception.Throws e Servant.API.Sub.:> (api1 Servant.API.Alternative.:<|> api2)) context