diff --git a/src/Aws/Lambda/Runtime.hs b/src/Aws/Lambda/Runtime.hs index 2ce9114..c0758d5 100644 --- a/src/Aws/Lambda/Runtime.hs +++ b/src/Aws/Lambda/Runtime.hs @@ -43,12 +43,14 @@ runLambda initializeCustomContext callback = do -- Purposefully shadowing to prevent using the initial "empty" context context <- Context.setEventData context event - ( ( ( invokeAndRun callback manager lambdaApi event context - `Checked.catch` \err -> Publish.parsingError err lambdaApi context manager + ( ( ( ( invokeAndRun callback manager lambdaApi event context + `Checked.catch` \err -> Publish.parsingError err lambdaApi context manager + ) + `Checked.catch` \err -> Publish.invocationError err lambdaApi context manager ) - `Checked.catch` \err -> Publish.invocationError err lambdaApi context manager + `Checked.catch` \(err :: Error.EnvironmentVariableNotSet) -> Publish.runtimeInitError err lambdaApi context manager ) - `Checked.catch` \(err :: Error.EnvironmentVariableNotSet) -> Publish.runtimeInitError err lambdaApi context manager + `Unchecked.catch` \(err :: Error.HandlerNotFound) -> Publish.handlerNotFoundError err lambdaApi context manager ) `Unchecked.catch` \err -> Publish.invocationError err lambdaApi context manager diff --git a/src/Aws/Lambda/Runtime/Error.hs b/src/Aws/Lambda/Runtime/Error.hs index 1ea1cde..4ce30ed 100644 --- a/src/Aws/Lambda/Runtime/Error.hs +++ b/src/Aws/Lambda/Runtime/Error.hs @@ -2,6 +2,7 @@ module Aws.Lambda.Runtime.Error ( EnvironmentVariableNotSet (..), Parsing (..), + HandlerNotFound (..), Invocation (..), ) where @@ -36,6 +37,16 @@ instance ToJSON Parsing where "errorMessage" .= ("Could not parse '" <> valueName <> "': " <> errorMessage) ] +newtype HandlerNotFound = HandlerNotFound Text + deriving (Show, Exception) + +instance ToJSON HandlerNotFound where + toJSON (HandlerNotFound handler) = + object + [ "errorType" .= ("Runtime.HandlerNotFound" :: Text), + "errorMessage" .= ("Could not find handler '" <> handler <> "'.") + ] + newtype Invocation = Invocation LBS.ByteString deriving (Show, Exception) diff --git a/src/Aws/Lambda/Runtime/Publish.hs b/src/Aws/Lambda/Runtime/Publish.hs index 5032231..ccab487 100644 --- a/src/Aws/Lambda/Runtime/Publish.hs +++ b/src/Aws/Lambda/Runtime/Publish.hs @@ -6,6 +6,7 @@ module Aws.Lambda.Runtime.Publish ( result, invocationError, parsingError, + handlerNotFoundError, runtimeInitError, ) where @@ -56,6 +57,14 @@ parsingError err lambdaApi context = (Endpoints.invocationError lambdaApi $ awsRequestId context) context +-- | Publishes a HandlerNotFound error back to AWS Lambda +handlerNotFoundError :: Error.HandlerNotFound -> Text -> Context context -> Http.Manager -> IO () +handlerNotFoundError err lambdaApi context = + publish + (encode err) + (Endpoints.invocationError lambdaApi $ awsRequestId context) + context + -- | Publishes a runtime initialization error back to AWS Lambda runtimeInitError :: ToJSON err => err -> Text -> Context context -> Http.Manager -> IO () runtimeInitError err lambdaApi = diff --git a/src/Aws/Lambda/Setup.hs b/src/Aws/Lambda/Setup.hs index 31555cd..c744774 100644 --- a/src/Aws/Lambda/Setup.hs +++ b/src/Aws/Lambda/Setup.hs @@ -64,6 +64,7 @@ import qualified Data.Text as Text import Data.Typeable (Typeable) import GHC.IO.Handle.FD (stderr) import GHC.IO.Handle.Text (hPutStr) +import qualified Aws.Lambda.Runtime.Error as Error type Handlers handlerType m context request response error = HM.HashMap HandlerName (Handler handlerType m context request response error) @@ -129,9 +130,7 @@ run dispatcherOptions mToIO handlers (LambdaOptions eventObject functionHandler case HM.lookup functionHandler asIOCallbacks of Just handlerToCall -> handlerToCall Nothing -> - throwM $ - userError $ - "Could not find handler '" <> (Text.unpack . unHandlerName $ functionHandler) <> "'." + throwM $ Error.HandlerNotFound (unHandlerName functionHandler) addStandaloneLambdaHandler :: HandlerName ->