module Ecluse.Core.Server.Fault (
RequestFault (..),
classifyEscape,
RenderEscape (..),
) where
import Ecluse.Core.Fault (boundedDetail)
import Ecluse.Core.Registry.Fault (ResponseBoundExceeded)
import Ecluse.Core.Telemetry.Metrics (RequestFaultCause (GateFault, RenderFault, UnclassifiedFault))
import Ecluse.Core.Text (displayExceptionT)
data RequestFault = RequestFault
{ RequestFault -> RequestFaultCause
rqCause :: RequestFaultCause
, RequestFault -> Text
rqDetail :: Text
}
deriving stock (RequestFault -> RequestFault -> Bool
(RequestFault -> RequestFault -> Bool)
-> (RequestFault -> RequestFault -> Bool) -> Eq RequestFault
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RequestFault -> RequestFault -> Bool
== :: RequestFault -> RequestFault -> Bool
$c/= :: RequestFault -> RequestFault -> Bool
/= :: RequestFault -> RequestFault -> Bool
Eq, Int -> RequestFault -> ShowS
[RequestFault] -> ShowS
RequestFault -> String
(Int -> RequestFault -> ShowS)
-> (RequestFault -> String)
-> ([RequestFault] -> ShowS)
-> Show RequestFault
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RequestFault -> ShowS
showsPrec :: Int -> RequestFault -> ShowS
$cshow :: RequestFault -> String
show :: RequestFault -> String
$cshowList :: [RequestFault] -> ShowS
showList :: [RequestFault] -> ShowS
Show)
newtype RenderEscape = RenderEscape SomeException
deriving stock (Int -> RenderEscape -> ShowS
[RenderEscape] -> ShowS
RenderEscape -> String
(Int -> RenderEscape -> ShowS)
-> (RenderEscape -> String)
-> ([RenderEscape] -> ShowS)
-> Show RenderEscape
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RenderEscape -> ShowS
showsPrec :: Int -> RenderEscape -> ShowS
$cshow :: RenderEscape -> String
show :: RenderEscape -> String
$cshowList :: [RenderEscape] -> ShowS
showList :: [RenderEscape] -> ShowS
Show)
instance Exception RenderEscape
classifyEscape :: SomeException -> RequestFault
classifyEscape :: SomeException -> RequestFault
classifyEscape SomeException
escape
| Just (ResponseBoundExceeded
_ :: ResponseBoundExceeded) <- SomeException -> Maybe ResponseBoundExceeded
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
escape = RequestFaultCause -> SomeException -> RequestFault
forall {e}. Exception e => RequestFaultCause -> e -> RequestFault
fault RequestFaultCause
GateFault SomeException
escape
| Just (RenderEscape SomeException
inner) <- SomeException -> Maybe RenderEscape
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
escape = RequestFaultCause -> SomeException -> RequestFault
forall {e}. Exception e => RequestFaultCause -> e -> RequestFault
fault RequestFaultCause
RenderFault SomeException
inner
| Bool
otherwise = RequestFaultCause -> SomeException -> RequestFault
forall {e}. Exception e => RequestFaultCause -> e -> RequestFault
fault RequestFaultCause
UnclassifiedFault SomeException
escape
where
fault :: RequestFaultCause -> e -> RequestFault
fault RequestFaultCause
cause e
rendered = RequestFaultCause -> Text -> RequestFault
RequestFault RequestFaultCause
cause (Text -> Text
boundedDetail (e -> Text
forall e. Exception e => e -> Text
displayExceptionT e
rendered))