{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
module Aws.Lambda.Runtime.Common
( RunCallback,
LambdaResult (..),
LambdaError (..),
LambdaOptions (..),
ApiGatewayDispatcherOptions (..),
HandlerType (..),
HandlerName (..),
RawEventObject,
)
where
import Aws.Lambda.Runtime.ALB.Types
import Aws.Lambda.Runtime.APIGateway.Types
( ApiGatewayDispatcherOptions (..),
ApiGatewayResponse,
ApiGatewayResponseBody,
)
import Aws.Lambda.Runtime.Context (Context)
import Aws.Lambda.Runtime.StandaloneLambda.Types
( StandaloneLambdaResponseBody,
)
import qualified Data.ByteString.Lazy as Lazy
import Data.Hashable (Hashable)
import Data.Text (Text)
import GHC.Generics (Generic)
import Data.String (IsString)
-- | Callback that we pass to the dispatcher function
type RunCallback (handlerType :: HandlerType) context =
LambdaOptions context -> IO (Either (LambdaError handlerType) (LambdaResult handlerType))
-- | A handler name used to configure the lambda in AWS
newtype HandlerName = HandlerName {unHandlerName :: Text}
deriving newtype (Eq, Show, Read, Ord, Hashable, IsString)
-- | The type of the handler depending on how you proxy the Lambda
data HandlerType
= StandaloneHandlerType
| APIGatewayHandlerType
| ALBHandlerType
-- | Wrapper type for lambda execution results
data LambdaError (handlerType :: HandlerType) where
StandaloneLambdaError :: StandaloneLambdaResponseBody -> LambdaError 'StandaloneHandlerType
APIGatewayLambdaError :: ApiGatewayResponse ApiGatewayResponseBody -> LambdaError 'APIGatewayHandlerType
ALBLambdaError :: ALBResponse ALBResponseBody -> LambdaError 'ALBHandlerType
-- | Wrapper type to handle the result of the user
data LambdaResult (handlerType :: HandlerType) where
StandaloneLambdaResult :: StandaloneLambdaResponseBody -> LambdaResult 'StandaloneHandlerType
APIGatewayResult :: ApiGatewayResponse ApiGatewayResponseBody -> LambdaResult 'APIGatewayHandlerType
ALBResult :: ALBResponse ALBResponseBody -> LambdaResult 'ALBHandlerType
-- | The event received by the lambda before any processing
type RawEventObject = Lazy.ByteString
-- | Options that the generated main expects
data LambdaOptions context = LambdaOptions
{ eventObject :: !RawEventObject,
functionHandler :: !HandlerName,
executionUuid :: !Text,
contextObject :: !(Context context)
}
deriving (Generic)